如何查询存在Date_closed但无Case_code 001的Case_Id?
解决你的Case_Id筛选问题
针对你提出的需求——找出所有在Table Two中Date_closed非空,但在Table One中未关联Case_code 001的Case_Id,这里有几种清晰高效的SQL解决方案:
方法一:使用NOT EXISTS(推荐,逻辑直观)
这种写法直接对应需求的逻辑:先找到已关闭的Case,再排除那些存在001编码的Case。
SELECT DISTINCT t2.Case_Id FROM Table_Two t2 WHERE t2.Date_closed IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM Table_One t1 WHERE t1.Case_Id = t2.Case_Id AND t1.Case_code = '001' );
代码解释:
DISTINCT:确保结果里没有重复的Case_Id(如果Table Two中同一个Case_Id有多条记录的话)t2.Date_closed IS NOT NULL:先筛选出已经完成关闭的CaseNOT EXISTS子查询:检查当前Case_Id在Table One中是否存在Case_code='001'的记录,不存在则保留该Case_Id
方法二:使用LEFT JOIN + IS NULL
这是另一种常用的筛选“不存在关联记录”的写法,适合习惯用JOIN逻辑的开发者:
SELECT DISTINCT t2.Case_Id FROM Table_Two t2 LEFT JOIN Table_One t1 ON t2.Case_Id = t1.Case_Id AND t1.Case_code = '001' WHERE t2.Date_closed IS NOT NULL AND t1.Case_Id IS NULL;
代码解释:
- 我们只把
Table Two和Table One中Case_code='001'的记录做关联 - 如果某个
Case_Id在Table One里没有001编码的记录,那么LEFT JOIN后t1.Case_Id会是NULL - 结合
Date_closed IS NOT NULL的条件,就能得到目标结果
方法三:使用GROUP BY + HAVING
如果需要统计每个Case的编码情况,这种分组统计的方法也能实现需求:
SELECT t1.Case_Id FROM Table_One t1 JOIN Table_Two t2 ON t1.Case_Id = t2.Case_Id WHERE t2.Date_closed IS NOT NULL GROUP BY t1.Case_Id HAVING SUM(CASE WHEN t1.Case_code = '001' THEN 1 ELSE 0 END) = 0;
代码解释:
- 先关联两个表,过滤出已关闭的Case记录
- 按
Case_Id分组,统计每个分组里Case_code='001'的数量 HAVING子句要求这个数量为0,也就是该Case没有001编码的关联记录
小提示:
- 优先选择
NOT EXISTS或LEFT JOIN的写法,大部分数据库的查询优化器会对这两种写法做很好的性能优化,执行效率更高 - 如果
Table Two中每个Case_Id只有一条记录,DISTINCT可以省略,但加上更稳妥,避免意外的重复结果
内容的提问来源于stack exchange,提问作者Gurpal
相关产品推荐
相关产品推荐

