从Oracle中删除表中的重复行

jua*_*uan 135 sql oracle duplicates delete-row

我正在Oracle中测试一些东西,并用一些示例数据填充了一个表,但是在这个过程中我不小心加载了重复的记录,所以现在我无法使用某些列创建主键.

如何删除所有重复的行并只留下其中一行?

Bil*_*ard 274

使用rowid伪列.

DELETE FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2, column3);
Run Code Online (Sandbox Code Playgroud)

在哪里column1,column2并且column3构成每条记录的识别密钥.您可以列出所有列.

  • +1我必须找到埋在12,000多条记录中的两个重复的电话号码.将DELETE更改为SELECT,并在几秒钟内找到它们.节省了我很多时间,谢谢. (4认同)
  • 这种方法对我不起作用.我不知道为什么.当我用"SELECT*"替换"DELETE"时,它返回了我想要删除的行,但是当我用"DELETE"执行时,它只是无限期地挂起. (3认同)
  • 如果选择有效,但删除没有,则可能是由于生成的子查询的大小.首先使用子查询结果创建一个create table,在min(rowid)列上构建一个索引,然后运行delete语句可能会很有趣. (2认同)

Dea*_*mer 15

问汤姆

delete from t
 where rowid IN ( select rid
                    from (select rowid rid, 
                                 row_number() over (partition by 
                         companyid, agentid, class , status, terminationdate
                                   order by rowid) rn
                            from t)
                   where rn <> 1);
Run Code Online (Sandbox Code Playgroud)

(修正了缺失的括号)


Mar*_*ark 11

来自DevX.com:

DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3...) ;
Run Code Online (Sandbox Code Playgroud)

其中column1,column2等是您要使用的键.


小智 11

DELETE FROM tablename a
      WHERE a.ROWID > ANY (SELECT b.ROWID
                             FROM tablename b
                            WHERE a.fieldname = b.fieldname
                              AND a.fieldname2 = b.fieldname2)
Run Code Online (Sandbox Code Playgroud)

  • 这比巨大的桌子要快得多,比Bill的解决方案要慢. (2认同)

小智 7

解决方案1)

delete from emp
where rowid not in
(select max(rowid) from emp group by empno);
Run Code Online (Sandbox Code Playgroud)

解决方案2)

delete from emp where rowid in
               (
                 select rid from
                  (
                    select rowid rid,
                      row_number() over(partition by empno order by empno) rn
                      from emp
                  )
                where rn > 1
               );
Run Code Online (Sandbox Code Playgroud)

解决方案3)

delete from emp e1
         where rowid not in
          (select max(rowid) from emp e2
           where e1.empno = e2.empno ); 
Run Code Online (Sandbox Code Playgroud)


小智 6

从t1创建表t2作为select distinct*;