You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:55:24