分组子句中CASE表达式(ELSE '不分组'):SQL查询方案是否正确?
问题分析与解决方案
原查询不正确,无法满足需求,以下是具体分析和修正方案:
原查询的问题
原查询的GROUP BY逻辑存在两处关键错误:
- 当
Linked IS NULL时按JobNo分组,Linked IS NOT NULL时按NULL分组,这会把所有Linked非空的行合并成一个组,最终仅返回一个JobNo(如12345)。 - 完全未处理需求中的核心判断条件:该JobNo是否在更早日期已有Status='New'的记录,直接导致符合条件的12351被遗漏。
正确实现方案
要满足需求,需先筛选出指定日期的New状态记录,再对每个JobNo做双重判断:
- 若该JobNo无更早的
New状态记录,直接纳入结果; - 若存在更早的
New记录,则当前记录的Linked字段不能为NULL。
代码实现
-- 定义目标查询日期 DECLARE @TargetDate DATE = '20230101'; SELECT DISTINCT j.JobNo FROM Jobs j WHERE j.Entered = @TargetDate AND j.Status = 'New' AND ( -- 情况1:该JobNo没有更早的New状态记录 NOT EXISTS ( SELECT 1 FROM Jobs j_earlier WHERE j_earlier.JobNo = j.JobNo AND j_earlier.Status = 'New' AND j_earlier.Entered < @TargetDate ) OR -- 情况2:存在更早的New记录,但当前Linked不为空 j.Linked IS NOT NULL );
结果验证
执行上述代码后,会返回12345和12351,完全符合预期:
- 12345:存在2021-12-29的
New记录,但当前Linked非空,满足条件; - 12351:无更早的
New记录,直接满足条件。
内容的提问来源于stack exchange,提问作者ImOnAChair2023
相关产品推荐
相关产品推荐

