删除表中重复的记录

来源:互联网 发布:static php 编辑:程序博客网 时间:2024/04/30 09:52
 

问题提出: 当我们想要为一个表创建唯一索引时,如果该表有重复的记录,则无法创建成功。

方法原理:
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,
  rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。

2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中
  那些具有最大rowid的就可以了,其余全部删除。

3、以下语句用到了3项技巧:rowid、子查询、别名。

实现方法:
SQL> create table a (
  2  bm char(4),  --编码
  3  mc varchar2(20)  --名称
  4  );

查出重复记录
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

删除重复记录
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

 

速度更快的办法:
delete from  tab where rowid in (
    SELECT rowid FROM tab
    minus
    SELECT  min(rowid) FROM tab
    group by col1,col2);

原创粉丝点击