SQL查询仅在Pisa放映电影返回无放映记录问题修正
问题根因
原查询仅通过not exists排除了「存在非Pisa城市放映记录」的电影,但没有对「电影是否有放映记录」做校验:没有任何放映场次的电影,子查询匹配不到任何非Pisa的放映记录,会被错误判定为符合条件,混入结果集。
要得到正确结果,查询逻辑需要同时满足两个判定规则:
- 电影不存在任何在Pisa以外城市的放映记录
- 电影至少存在1场在Pisa城市的放映记录(排除无任何放映的影片)
修正后的SQL实现
写法1:双EXISTS判定(和原逻辑兼容性最好)
SELECT f.Titolo FROM Film f WHERE -- 排除有非Pisa城市放映的电影 NOT EXISTS ( SELECT * FROM Sale s INNER JOIN Proiezioni p ON p.xCodSala = s.CodSala WHERE f.CodFilm = p.xCodFilm AND s.Citta <> 'Pisa' ) -- 排除无任何放映记录的电影,要求至少有1场Pisa的放映 AND EXISTS ( SELECT * FROM Sale s INNER JOIN Proiezioni p ON p.xCodSala = s.CodSala WHERE f.CodFilm = p.xCodFilm AND s.Citta = 'Pisa' );
写法2:分组聚合判定(写法更简洁)
通过内连接关联放映表,天然过滤无放映记录的电影,再通过分组后的聚合判断所有放映场次是否都在Pisa:
SELECT f.Titolo FROM Film f INNER JOIN Proiezioni p ON f.CodFilm = p.xCodFilm INNER JOIN Sale s ON p.xCodSala = s.CodSala GROUP BY f.CodFilm, f.Titolo -- 统计非Pisa的放映场次,要求数量为0 HAVING COUNT(DISTINCT CASE WHEN s.Citta <> 'Pisa' THEN 1 END) = 0;
执行结果验证
基于提供的测试数据执行上述任意一种SQL,都会返回预期的单条结果:
| Titolo |
|---|
| I Predatori |
内容的提问来源于stack exchange,提问作者mcaSO
相关产品推荐
相关产品推荐

