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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:54:04