TSQL:如何筛选从未出现指定状态(Transferred)的ID?
查找从未出现指定状态的ID(TSQL实现)
嘿,我来给你几个实用的TSQL查询方案,都能帮你找出从未出现过Transferred状态的ID:
方法1:使用NOT EXISTS(最直观的写法)
这种方法逻辑清晰,通过子查询排除那些存在Transferred记录的ID:
SELECT DISTINCT ID FROM YourTableName t1 WHERE NOT EXISTS ( SELECT 1 FROM YourTableName t2 WHERE t2.ID = t1.ID AND t2.Status = 'Transferred' );
解释:先获取表中所有唯一的ID,然后筛选出不存在对应Transferred状态记录的ID。DISTINCT用来避免同一个ID被多次返回(比如某个ID有多个Received记录)。
方法2:使用LEFT JOIN + IS NULL
通过左关联自身表,筛选出关联不上的记录:
SELECT DISTINCT t1.ID FROM YourTableName t1 LEFT JOIN YourTableName t2 ON t1.ID = t2.ID AND t2.Status = 'Transferred' WHERE t2.ID IS NULL;
解释:把原表和自身按ID关联,关联条件限定为Status = 'Transferred'。如果左表的ID在右表中找不到匹配的记录,说明这个ID从未有过Transferred状态,此时右表的ID会是NULL,通过这个条件筛选即可。
方法3:使用GROUP BY + HAVING
通过分组统计来判断是否存在目标状态:
SELECT ID FROM YourTableName GROUP BY ID HAVING MAX(CASE WHEN Status = 'Transferred' THEN 1 ELSE 0 END) = 0;
解释:按ID分组后,用CASE表达式给每个ID标记是否有Transferred状态(有则为1,无则为0)。如果最大值是0,说明这个ID下没有任何Transferred记录。这种写法不需要额外加DISTINCT,因为GROUP BY已经确保ID唯一。
注意事项
记得把代码中的YourTableName替换成你实际使用的表名。如果你的表数据量较大,建议给ID和Status列创建复合索引,能大幅提升查询效率。
内容的提问来源于stack exchange,提问作者user3465260
相关产品推荐
相关产品推荐

