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

如何编写SQL查询指定比赛日期下无日程封禁的裁判员名单

正确SQL实现方案

核心筛选逻辑

我们只需要排除「对应比赛当日存在封禁记录」的裁判即可,用NOT EXISTS实现该逻辑性能更稳定,不会出现空值导致NOT IN失效的问题。

通用基础查询(返回单行列的裁判姓名)

如果你的入参是选中的赛事ID@GameId,关联Games表匹配对应比赛日期即可:

SELECT o.RefId, o.Name
FROM Officials o
WHERE NOT EXISTS (
    SELECT 1
    FROM Blocks b
    INNER JOIN Games g ON b.BlockDate = g.GameDate
    WHERE g.GameId = @GameId
      AND b.RefId = o.RefId
)

如果你的入参是直接传入比赛日期@GameDate,可以简化逻辑:

SELECT o.Name
FROM Officials o
WHERE NOT EXISTS (
    SELECT 1 FROM Blocks b
    WHERE b.RefId = o.RefId AND b.BlockDate = @GameDate
)

按要求拼接为字符串输出

不同数据库的字符串拼接函数有差异,以下是主流数据库的实现:

MySQL 版本

SELECT GROUP_CONCAT(
    CASE WHEN rn = total THEN CONCAT('and ', Name) ELSE Name END
    ORDER BY o.RefId
    SEPARATOR ', '
) AS available_referees
FROM (
    SELECT 
        o.Name,
        ROW_NUMBER() OVER (ORDER BY o.RefId) AS rn,
        COUNT(*) OVER () AS total
    FROM Officials o
    WHERE NOT EXISTS (
        SELECT 1
        FROM Blocks b
        INNER JOIN Games g ON b.BlockDate = g.GameDate
        WHERE g.GameId = @GameId
          AND b.RefId = o.RefId
    )
) t

SQL Server 版本

SELECT STRING_AGG(
    CASE WHEN rn = total THEN 'and ' + Name ELSE Name END,
    ', '
) WITHIN GROUP (ORDER BY o.RefId) AS available_referees
FROM (
    SELECT 
        o.Name,
        o.RefId,
        ROW_NUMBER() OVER (ORDER BY o.RefId) AS rn,
        COUNT(*) OVER () AS total
    FROM Officials o
    WHERE NOT EXISTS (
        SELECT 1
        FROM Blocks b
        INNER JOIN Games g ON b.BlockDate = g.GameDate
        WHERE g.GameId = @GameId
          AND b.RefId = o.RefId
    )
) t

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:45:01