Oracle删除重复数据记录

删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在哪个数据文件、哪个块上。

利用not in:

delete from manager 

where ROWID NOT IN( select  MIN(ROWID) from manager group by mgrno);

删除之前的数据:

SQL> select * from manager;

     MGRNO MNAME                          JOB
---------- ------------------------------ --------------------------
SALARY
--------------------------------------------------------------------
        11 Jane                           j1
1000

        11 Jane                           j2
1000

        12 Dane                           j1
1200

        11 Jane                           j1
1000

        13 Kate                           j0
1300

删除后:

SQL> select * from manager;

     MGRNO MNAME                          JOB
---------- ------------------------------ ------------------------------
SALARY
---------------------------------------------------------------------------
        11 Jane                           j1
1000

        12 Dane                           j1
1200

        13 Kate                           j0
1300


已选择3行。

利用不等于

delete from  manager  a where ROWID != (select  MAX(ROWID)

from manager b where a.mgrno =b.mgrno)

利用临时表:

创建一个临时表 tem_manager , 该表中存放的数据和表manager 的相同,只是该表中不存放重复记录。

create table tem_manager

as

(select  distinct mgrno,mname,job,salary from manager);

然后删除表manager中的数据:

truncate table manager;

把临时表中的数据插入到原来的表manager中:

insert into  manager

select * from tem_manager;

原文地址:https://www.cnblogs.com/happinessqi/p/3348935.html