SQL多WITH子句查询时第13行awd位置报错如何解决
报错原因解释
- 第13行
awd位置的语法错误原因:NOT IN运算符后接结果集时必须用括号包裹查询语句,直接写NOT IN awd不符合SQL语法规范,必须改为NOT IN (SELECT id FROM awd)才能正确匹配获奖导演ID。 - 额外逻辑错误:第二个CTE
mc的设计不符合需求,当前写法统计的是全表所有电影的总数量,不是每个导演的执导作品数量,且聚合函数MAX()不能直接写在WHERE子句中做筛选条件。 - 隐式逻辑漏洞:主查询没有按导演ID分组,无法统计每个导演的执导影片数量,直接关联
director和movie表会返回所有导演-电影的匹配行,无法得到单导演的计数结果。
修复后代码(保留多WITH结构,未改动原有实现框架)
WITH awd AS ( -- 筛选所有获得过奖项的导演ID,加DISTINCT避免重复 SELECT DISTINCT director.id FROM director INNER JOIN director_award ON director.title = director_award.title AND director.production_year = director_award.production_year ), mc AS ( -- 统计每个未获奖导演的执导影片数量 SELECT director.id, COUNT(*) as movie_count FROM director JOIN movie ON director.title = movie.title AND director.production_year = movie.production_year WHERE director.id NOT IN (SELECT id FROM awd) GROUP BY director.id ) -- 取执导数量最大的导演ID SELECT id FROM mc WHERE movie_count = (SELECT MAX(movie_count) FROM mc);
调整说明
- 给awd CTE的查询增加
DISTINCT,避免同一个导演多次获奖导致ID重复,降低NOT IN匹配的冗余计算 - 重写mc CTE逻辑:先过滤获奖导演,再按导演ID分组统计每个导演的执导影片数量
- 最终查询匹配mc中执导数量等于最大值的导演ID,完全符合需求
内容的提问来源于stack exchange,提问作者Mysteryxx3
相关产品推荐
相关产品推荐

