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

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);

逻辑说明:

  1. 先关联Projects和ProjectAwards,筛选出所有获奖(result='won')的项目
  2. 关联years_sp,仅保留指定年份内的获奖项目
  3. 按经理分组,统计该经理有获奖项目的不同年份数
  4. 用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'
    )
);

逻辑说明:

  1. 外层查询先获取所有经理
  2. 内层第一个NOT EXISTS:检查是否存在某个指定年份,该经理在该年份没有获奖项目
  3. 如果存在这样的年份,就排除该经理;否则保留,即为符合条件的经理

内容的提问来源于stack exchange,提问作者Matteo Spinelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:01:16