Oracle SQL删除除procurement_type外其余字段相同的重复行
Oracle SQL 重复行删除实现
针对「除procurement_type字段取值不同外,其余字段完全一致的重复数据,仅保留单条、删除其余重复项」的需求,可通过Oracle窗口函数实现,语句如下:
-- 操作提示:正式执行删除前,可先将外层DELETE替换为SELECT * 校验待删除数据范围,避免误删 DELETE FROM 你的业务表名 t WHERE t.ROWID IN ( SELECT tmp.rid FROM ( SELECT ROWID rid, ROW_NUMBER() OVER( -- 按除procurement_type外的所有业务字段分区,判断重复 PARTITION BY 字段A, 字段B, 字段C, 字段D -- 替换为业务表中除procurement_type外的全部字段 -- 排序规则决定同组内保留哪条数据,可按需调整 ORDER BY procurement_type ) rn FROM 你的业务表名 ) tmp WHERE tmp.rn > 1 -- 删除同组内排序后序号大于1的重复行 ); -- 确认删除结果无误后执行提交 COMMIT;
自定义保留规则
如果需要固定保留某类procurement_type取值的行,只需要调整窗口函数内的ORDER BY逻辑即可,例如要固定保留procurement_type值为STANDARD_BID的行,可将排序部分改写为:
ORDER BY CASE WHEN procurement_type = 'STANDARD_BID' THEN 0 ELSE 1 END
注意事项
PARTITION BY后必须列全除procurement_type外的所有字段,否则会出现重复判定错误- 生产环境执行删除前务必备份相关数据,先校验待删除数据集再执行提交操作

内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

