MSSQL按ID分组判断是否存在符合指定日期与tag条件的记录
原方案可行性判断
原方案不可行,存在以下明确问题:
- 字段名不匹配:原表字段为
colID、coldate、coltag,原SQL错误使用ID、date、Tag作为字段名,执行会直接报错 - 日期条件语法错误:
date <> 2021-11-10未加单引号,会被识别为数值减法运算,无法正确匹配日期值 - 未过滤目标ID集合:会返回表中所有存在的ID(包括你不需要的11111),不符合需求
- 性能冗余:子查询+sum聚合的写法需要逐行关联计算全量数据,实际上只要找到1条符合条件的记录就可以停止判断,不需要计算总和
更优实现方案
方案1:EXISTS半连接判断(性能最优)
这是最符合需求的实现,EXISTS找到第一条符合条件的记录就会终止该ID的后续扫描,性能远高于聚合计算,且能精准返回指定的ID集合:
SELECT v.colID, CASE WHEN EXISTS( SELECT 1 FROM table1 t WHERE t.colID = v.colID AND t.coldate <> '2021-11-10' AND t.coltag = 1 ) THEN 1 ELSE 0 END AS checkfoundentry FROM ( -- 此处固定你要查询的目标ID集合,不会返回多余ID VALUES (15551),(12123),(12345),(74141) ) v(colID)
执行结果完全匹配你的预期:
| colID | checkfoundentry |
|---|---|
| 15551 | 0 |
| 12123 | 1 |
| 12345 | 0 |
| 74141 | 0 |
方案2:分组聚合写法(适合需要同步统计其他指标的场景)
如果你习惯用分组聚合逻辑,也可以用以下写法,性能略低于方案1,但优于你原有的嵌套子查询写法:
SELECT colID, CASE WHEN SUM(CASE WHEN coldate <> '2021-11-10' AND coltag =1 THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END AS checkfoundentry FROM table1 WHERE colID IN (15551,12123,12345,74141) GROUP BY colID
内容的提问来源于stack exchange,提问作者user16025262
相关产品推荐
相关产品推荐

