在日常数据库管理中,我们经常会遇到需要删除表中重复数据的情况。重复数据不仅会影响查询的准确性,还会增加数据库的存储成本。本文将通过实际例子展示两种常用的 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(18, 60),
ROUND(DBMS_RANDOM.VALUE(30000, 100000), 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(25, 35),
ROUND(50000, 2)
);
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




