暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何快速清理 Oracle 表内重复数据?两种高效实战方法

数据库驾驶舱 2024-09-03
494

在日常数据库管理中,我们经常会遇到需要删除表中重复数据的情况。重复数据不仅会影响查询的准确性,还会增加数据库的存储成本。本文将通过实际例子展示两种常用的 Oracle 方法,帮助你快速高效地删除表内的重复数据。

我们将使用一个简单的表 sample_table
,它包含随机生成的数据和一部分重复数据。首先创建并填充数据:

CREATE TABLE sample_table (
    id NUMBER,
    name VARCHAR2(100),
    age NUMBER,
    salary NUMBER,
    CONSTRAINT pk_id PRIMARY KEY (id)
);

BEGIN
    -- 插入随机数据
    FOR i IN 1..90 LOOP
        INSERT INTO sample_table (id, name, age, salary) VALUES (
            i,
            'Name_' || TO_CHAR(i),
            DBMS_RANDOM.VALUE(1860),
            ROUND(DBMS_RANDOM.VALUE(30000100000), 2)
        );
    END LOOP;
    
    -- 插入重复数据
    FOR i IN 91..100 LOOP
        INSERT INTO sample_table (id, name, age, salary) VALUES (
            i,
            'Name_' || TO_CHAR(MOD(i, 5+ 1),
            DBMS_RANDOM.VALUE(2535),        
            ROUND(500002)
        );
    END LOOP;
END;
/

「查询重复数据」

首先,我们可以使用以下 SQL 查询来确认表中哪些数据存在重复。通过 name
字段对数据进行分组,查找出现次数超过一次的条目:

SELECT name, COUNT(*
FROM sample_table 
GROUP BY name 
HAVING COUNT(*> 1;

「方法一:使用 ROW_NUMBER()
函数」

第一种方法使用 Oracle 的 ROW_NUMBER()
函数,通过对重复数据进行编号,保留第一条记录并删除其余的重复数据:

DELETE FROM sample_table 
WHERE id IN (
    SELECT id 
    FROM (
        SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) rn, t.* 
        FROM sample_table t
    ) 
    WHERE rn != 1  -- 保留每组数据的第一条记录,删除编号大于1的重复数据
);

「方法二:使用 ROWID
MIN()
函数」

第二种方法是通过 ROWID
删除重复记录。ROWID
是 Oracle 用来唯一标识表中每一行的物理地址,通过选择 name
字段的最小 ROWID
保留第一条记录:

DELETE FROM sample_table 
WHERE rowid NOT IN (
    SELECT MIN(rowid)  -- 每组 `name` 的最小 `ROWID`,即每组的第一条记录。
    FROM sample_table 
    GROUP BY name
);

「总结」

通过这两种方法,我们可以快速删除 Oracle 表中的重复数据。第一种方法利用了 ROW_NUMBER()
,更加灵活,适合需要复杂排序和筛选的场景。第二种方法则更加简单高效,适用于小规模的重复数据清理。

通过这些步骤,数据库中的数据将更加干净,查询性能也将得到提升。

「欢迎关注我们的公众号,获取更多技术分享与经验交流。」


文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论