如何在MSSQL查询中排除存在Solved='FR'记录的同一ID的所有行?
解决方案:MSSQL中排除包含特定记录的ID组
当然可以直接通过SQL语句实现这个需求,完全不用在Python/JavaScript里做二次过滤。你的核心需求是保留那些整个ID分组中从未出现过Solved='FR'的所有行,下面给你几种在MSSQL里高效可行的方案:
方法1:使用NOT EXISTS(推荐,性能优异)
这是最直观且MSSQL优化器处理得最好的写法之一,逻辑是检查当前行的ID下是否存在Solved='FR'的记录,不存在则保留该行:
SELECT ID, ID2, AnotherCondition, Steps, Process, Solved FROM YourTable t WHERE NOT EXISTS ( SELECT 1 FROM YourTable t2 WHERE t2.ID = t.ID AND t2.Solved = 'FR' )
替换
YourTable为你的实际表名即可。如果ID列有索引,这个查询的性能会非常好。
方法2:使用LEFT JOIN过滤
先提取所有包含Solved='FR'的ID,再通过左连接排除这些ID的所有行:
SELECT t.* FROM YourTable t LEFT JOIN ( -- 先找出所有有FR记录的ID SELECT DISTINCT ID FROM YourTable WHERE Solved = 'FR' ) fr_ids ON t.ID = fr_ids.ID -- 过滤掉匹配到FR ID的行 WHERE fr_ids.ID IS NULL
方法3:使用窗口函数(适合复杂分组场景)
通过窗口函数统计每个ID下Solved='FR'的记录数,再过滤掉计数大于0的行:
WITH IdFrStats AS ( SELECT *, -- 统计当前ID下FR记录的数量 COUNT(CASE WHEN Solved = 'FR' THEN 1 END) OVER(PARTITION BY ID) AS fr_record_count FROM YourTable ) SELECT ID, ID2, AnotherCondition, Steps, Process, Solved FROM IdFrStats WHERE fr_record_count = 0
这三种方法都能精准返回你需要的结果:仅保留ID为1、3、5的所有行,完全排除ID为2、4、6的记录。
内容的提问来源于stack exchange,提问作者BGBVlC
相关产品推荐
相关产品推荐

