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
相关产品推荐
相关产品推荐

