SQL是否支持FOR EVERY类语法?如何筛选全年度获奖项目的经理
解决方法:筛选所有指定年份均有获奖项目的经理
首先纠正你原SQL中的几个明显错误:
- 表名引用错误:把
Projects误写为Movies/Movie - 关联方式错误:使用
CROSS JOIN会生成无意义的笛卡尔积,应该用INNER JOIN并通过ON条件关联表 - 分组字段错误:应该按
Projects.manager分组,而非Movie.director - HAVING条件逻辑错误:
COUNT(*) > COUNT(years_sp)无法实现“覆盖所有年份”的校验需求
SQL中没有直接的FOR EVERY语法,但可以通过两种常用思路实现你的需求:
方法一:分组统计年份覆盖数
核心逻辑:统计每个经理有获奖项目的不同年份数量,如果该数量等于years_sp中的总年份数,说明该经理覆盖了所有指定年份。
WITH years_sp AS ( -- 此处替换为你的指定年份列表,示例如下 SELECT 2020 AS sp UNION ALL SELECT 2021 AS sp UNION ALL SELECT 2022 AS sp ) SELECT p.manager FROM Projects p INNER JOIN ProjectAwards pa ON p.title = pa.title AND p.year = pa.year INNER JOIN years_sp ys ON p.year = ys.sp WHERE pa.result = 'won' GROUP BY p.manager -- 校验经理的获奖年份数是否等于指定年份总数 HAVING COUNT(DISTINCT p.year) = (SELECT COUNT(*) FROM years_sp);
逻辑说明:
- 先关联
Projects和ProjectAwards,筛选出所有获奖(result='won')的项目 - 关联
years_sp,仅保留指定年份内的获奖项目 - 按经理分组,统计该经理有获奖项目的不同年份数
- 用
HAVING条件判断该年份数是否等于years_sp的总年份数,满足则说明该经理在每个指定年份都有至少一个获奖项目
方法二:双重NOT EXISTS反证法
核心逻辑:“所有指定年份都有获奖项目”等价于“不存在任何一个指定年份,该经理没有获奖项目”,用双重否定实现“FOR EVERY”的效果。
WITH years_sp AS ( -- 此处替换为你的指定年份列表 SELECT 2020 AS sp UNION ALL SELECT 2021 AS sp UNION ALL SELECT 2022 AS sp ) SELECT DISTINCT p.manager FROM Projects p WHERE NOT EXISTS ( -- 排除存在某个指定年份的情况 SELECT 1 FROM years_sp ys WHERE NOT EXISTS ( -- 该年份下,该经理没有任何获奖项目 SELECT 1 FROM Projects p2 INNER JOIN ProjectAwards pa ON p2.title = pa.title AND p2.year = pa.year WHERE p2.manager = p.manager AND p2.year = ys.sp AND pa.result = 'won' ) );
逻辑说明:
- 外层查询先获取所有经理
- 内层第一个
NOT EXISTS:检查是否存在某个指定年份,该经理在该年份没有获奖项目 - 如果存在这样的年份,就排除该经理;否则保留,即为符合条件的经理
内容的提问来源于stack exchange,提问作者Matteo Spinelli
相关产品推荐
相关产品推荐

