You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL多表JOIN后去除冗余行的正确查询语句求助

解决方案:清理冗余的Success记录

根据你的需求:当同一个ID同时存在status2=Error和status2=Success的记录时,删除Success的行;若ID只有Success记录则保留。以下是两种可行的SQL写法:

方法1:使用EXISTS子查询(兼容多数数据库)

适合MySQL、PostgreSQL、SQL Server等绝大多数数据库:

DELETE t1
FROM your_table t1
WHERE t1.status2 = 'Success'
AND EXISTS (
    SELECT 1
    FROM your_table t2
    WHERE t2.ID = t1.ID
    AND t2.status2 = 'Error'
);

逻辑:只删除那些status2是Success,且对应ID下存在Error记录的行。

方法2:使用窗口函数(适合支持窗口函数的数据库)

如果你的数据库版本支持窗口函数(比如MySQL 8.0+、PostgreSQL 9.4+、SQL Server 2008+),可以用这种更灵活的方式:

WITH ranked_records AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY ID 
            ORDER BY CASE status2 WHEN 'Error' THEN 1 ELSE 2 END
        ) AS rn
    FROM your_table
)
DELETE FROM ranked_records
WHERE rn > 1;

逻辑:

  • 按ID分组,给每个ID下的记录排优先级:Error标记为1,Success标记为2
  • 删除排名大于1的行,也就是每个ID只保留优先级最高的记录(有Error留Error,无Error留Success)

如果想先验证结果再删除,可以改成查询语句:

SELECT *
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY ID 
            ORDER BY CASE status2 WHEN 'Error' THEN 1 ELSE 2 END
        ) AS rn
    FROM your_table
) t
WHERE rn = 1;

内容的提问来源于stack exchange,提问作者Julie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:31:05