SQL Relational Division问题:查询全量CHOCOLAT开头电影演员的语句异常
解决SQL查询的异常问题:无目标电影时返回空表
原查询的问题根源很明确:当没有标题以CHOCOLAT开头的电影时,SELECT film_id FROM Film WHERE title LIKE 'CHOCOLAT%'返回空集。空集和任何集合做EXCEPT运算结果还是空集,NOT EXISTS(空集)会判定为真,导致所有演员都被筛选出来,不符合预期的空表要求。
下面提供两种可行的修改方案:
方案一:添加目标电影存在性判断
直接在原WHERE条件里追加一个判断,确保只有当存在至少一部CHOCOLAT开头的电影时,才执行原有的演员筛选逻辑。修改后的SQL如下:
SELECT actor_id, first_name || ' ' || last_name AS fullname FROM Actor A WHERE -- 先确认存在目标电影 EXISTS (SELECT 1 FROM Film WHERE title LIKE 'CHOCOLAT%') AND NOT EXISTS ( SELECT film_id FROM Film F WHERE title LIKE 'CHOCOLAT%' EXCEPT SELECT film_id FROM Film_Actor FA WHERE FA.actor_id = A.actor_id ) ORDER BY fullname
这个方案改动最小,完全保留了你原有的核心逻辑,只是多了一层前置判断,避免无目标电影时的异常。
方案二:通过统计数量匹配筛选
换一种思路:先把所有CHOCOLAT开头的电影提取出来,然后统计每个演员出演这些电影的数量,只有当数量等于目标电影总数,且总数大于0时,才保留该演员。SQL代码如下:
WITH ChocolatFilms AS ( SELECT film_id FROM Film WHERE title LIKE 'CHOCOLAT%' ) SELECT A.actor_id, A.first_name || ' ' || A.last_name AS fullname FROM Actor A JOIN Film_Actor FA ON A.actor_id = FA.actor_id JOIN ChocolatFilms CF ON FA.film_id = CF.film_id GROUP BY A.actor_id, A.first_name, A.last_name HAVING COUNT(DISTINCT CF.film_id) = (SELECT COUNT(*) FROM ChocolatFilms) AND (SELECT COUNT(*) FROM ChocolatFilms) > 0 ORDER BY fullname;
这种方案逻辑更直观,通过分组统计的方式明确筛选出演过全部目标电影的演员,同时通过总数判断避免无目标电影时的错误返回。
内容的提问来源于stack exchange,提问作者cheesecakefactory
相关产品推荐
相关产品推荐

