如何编写SQL查询排除含失败或待处理状态的ID?
编写SQL查询排除含特定状态的ID
你的初始查询存在逻辑问题:它仅筛选单条记录状态为S且不是F/P的行,但无法排除那些同一ID下存在F或P状态记录的情况——比如某个ID同时有S和F的记录,初始查询会把S的行查出来,但按照需求这个ID应该被完全排除。
要实现需求(仅保留所有关联记录中无F、无P,且至少有S状态的ID),可以用以下两种方法:
方法一:使用NOT EXISTS子查询
通过子查询检查当前ID下是否存在F或P的记录,仅保留无此类记录且自身为S的ID:
SELECT DISTINCT a.ID FROM TABLE a WHERE a.Content = 'Submit' AND a.Status = 'S' AND NOT EXISTS ( SELECT 1 FROM TABLE b WHERE b.ID = a.ID AND b.Content = 'Submit' AND b.Status IN ('F', 'P') );
添加DISTINCT是为了避免同一ID有多条S记录时重复输出。
方法二:使用分组+HAVING子句
按ID分组后,通过聚合函数判断该ID下是否存在F/P,同时确保至少有S状态:
SELECT ID FROM TABLE WHERE Content = 'Submit' GROUP BY ID HAVING SUM(CASE WHEN Status IN ('F', 'P') THEN 1 ELSE 0 END) = 0 AND SUM(CASE WHEN Status = 'S' THEN 1 ELSE 0 END) > 0;
- 第一个
SUM统计F/P的记录数,等于0表示该ID下无此类状态; - 第二个
SUM确保该ID至少有一条S状态的记录,避免筛选出无任何有效状态的ID。
内容的提问来源于stack exchange,提问作者Dnis
相关产品推荐
相关产品推荐

