如何在PLSQL中按指定条件删除表中的重复数据
PLSQL实现按指定规则删除表重复行方案
假设你操作的表名为loan_policy,实际使用时替换为你的真实表名即可,核心逻辑通过窗口函数给同Policy #分组内的行按规则排序,保留排序第一位的行,删除其余重复行:
前置校验:先确认待删除的重复行
执行以下查询核对要删除的内容是否符合规则,避免后续误删数据:
SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY "Policy #" ORDER BY "Price of Loan" DESC, CASE WHEN PersonID IS NOT NULL THEN 1 ELSE 2 END ASC ) AS rn FROM loan_policy t ) WHERE rn > 1;
查询结果里的行就是所有待删除的重复行,确认无误后再执行删除操作。
正式删除操作
方式1:直接删除(适合中小数据量表)
基于ROWID删除效率更高,不会出现字段匹配错误问题:
DELETE FROM loan_policy WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID AS rid, ROW_NUMBER() OVER ( PARTITION BY "Policy #" ORDER BY "Price of Loan" DESC, CASE WHEN PersonID IS NOT NULL THEN 1 ELSE 2 END ASC ) AS rn FROM loan_policy ) WHERE rn > 1 ); -- 确认删除结果无误后再提交事务 COMMIT;
方式2:先备份再删除(适合生产环境操作)
如果需要留存重复行的备份,可以先建备份表再执行删除:
-- 备份待删除的重复行 CREATE TABLE loan_policy_dup_backup AS SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY "Policy #" ORDER BY "Price of Loan" DESC, CASE WHEN PersonID IS NOT NULL THEN 1 ELSE 2 END ASC ) AS rn FROM loan_policy t ) WHERE rn > 1; -- 从原表删除重复行 DELETE FROM loan_policy WHERE ROWID IN (SELECT ROWID FROM loan_policy_dup_backup); -- 确认结果无误后提交 COMMIT;
注意事项
- Oracle中字段名包含空格、
#等特殊字符时,必须用双引号包裹,且大小写要和表结构定义的字段大小写完全一致,如果你的表字段是大写命名,需要对应修改为"POLICY #"、"PRICE OF LOAN"等格式。 - 大表删除重复行时建议分批操作,避免长时间锁表影响正常业务使用。
内容的提问来源于stack exchange,提问作者Thinh Le
相关产品推荐
相关产品推荐

