删除重复记录,利用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;