SQL按Doc_No配对Code为101/102规则删除行的实现求助
原有SQL的错误问题
- 核心逻辑完全偏离需求:你原本的过滤规则是「只要某个Doc_No的记录数大于1就排除」,既没有判断「Code=101和102配对」这个核心删除条件,还反向把所有重复的Doc_No都筛掉了,自然会把需要保留的ghi1234(2条同Code=101的记录)也排除。
- 原SQL的
WHERE b.Count_Item < 2等价于只保留只有1条记录的Doc_No,完全不符合你“保留无配对的重复行、只删有101/102配对的整组”的要求。
正确实现思路
只需两步即可匹配需求:
- 先通过分组过滤,找出所有同时存在Code=101、Code=102两条不同值的Doc_No,这些就是需要整组删除的目标(对应你测试场景里的abc1234、def5678)
- 从原表中筛选出Doc_No不在上述删除集合里的所有行,就是你要的预期输出结果。
可直接运行的查询SQL(获取预期保留的结果)
SELECT * FROM dbo.test WHERE Doc_No NOT IN ( -- 筛选出所有需要整组删除的Doc_No SELECT Doc_No FROM dbo.test GROUP BY Doc_No -- 同时存在101和102的Doc_No才符合删除条件 HAVING SUM(CASE WHEN Code = 101 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN Code = 102 THEN 1 ELSE 0 END) > 0 )
执行上述SQL的结果完全匹配你的预期:
- abc1234、def5678因为同时有101、102的Code,被排除
- ghi1234只有Code=101,没有102配对,2条记录全部保留
- jkl5678只有单条101记录,正常保留
若需要直接删除符合条件的行,使用如下SQL
DELETE FROM dbo.test WHERE Doc_No IN ( SELECT Doc_No FROM dbo.test GROUP BY Doc_No HAVING SUM(CASE WHEN Code = 101 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN Code = 102 THEN 1 ELSE 0 END) > 0 )
逻辑适配说明
- 该逻辑不需要判断Doc_No的行数,只要同一Doc_No下同时存在101、102两个Code值,不管总共有多少行,都会整组删除
- 如果你的Code字段是字符串类型,只需把CASE里的判断条件改成
Code = '101'、Code = '102'即可正常运行
内容的提问来源于stack exchange,提问作者rain123
相关产品推荐
相关产品推荐

