You need to enable JavaScript to run this app. SQL按Doc_No配对Code为101/102规则删除行的实现求助
优惠活动
大模型
产品
解决方案
定价
更多

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配对的整组”的要求。
正确实现思路

只需两步即可匹配需求:

  1. 先通过分组过滤,找出所有同时存在Code=101、Code=102两条不同值的Doc_No,这些就是需要整组删除的目标(对应你测试场景里的abc1234、def5678)
  2. 从原表中筛选出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 21:06:03