在 Oracle 数据库中删除重复数据并只保留一条记录,有几种常见方法:

方法一:使用 ROWID 和子查询

DELETE FROM 表名
WHERE ROWID NOT IN (
    SELECT MIN(ROWID)
    FROM 表名
    GROUP BY 列1, 列2, 列3  -- 指定判断重复的列
);

方法二:使用 ROW_NUMBER() 分析函数

DELETE FROM 表名
WHERE ROWID IN (
    SELECT ROWID FROM (
        SELECT ROWID, 
               ROW_NUMBER() OVER (PARTITION BY 列1, 列2, 列3 ORDER BY ROWID) AS rn
        FROM 表名
    ) WHERE rn > 1
);

方法三:创建临时表

-- 1. 创建临时表存储不重复数据
CREATE TABLE 临时表 AS
SELECT * FROM (
    SELECT t.*, 
           ROW_NUMBER() OVER (PARTITION BY 列1, 列2, 列3 ORDER BY ROWID) AS rn
    FROM 原表 t
) WHERE rn = 1;

-- 2. 清空原表
TRUNCATE TABLE 原表;

-- 3. 将临时表数据插回原表
INSERT INTO 原表 SELECT * FROM 临时表;

-- 4. 删除临时表
DROP TABLE 临时表;

注意事项

  1. 在执行删除操作前,建议先备份数据

  2. 替换上述 SQL 中的"表名"、"列1,列2,列3"为实际的表名和列名

  3. 对于大表,方法三(临时表)通常性能更好

  4. 如果表有主键或唯一约束,可能需要先禁用约束

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐