思路:记录虽然存在重复,但是rowid是唯一的,所以在子查询取得重复行中最小的rowid,删除重复行中
大于最小的rowid的行,只是保留了最小rowid的行,就是删除了重复行。
 
这个语句如果要调优的话,可以在内部查询中建索引。
SQL> select * from ttt;
NAME
--------------------

ab
ab
cd
cd
ef

SQL> delete from ttt a where rowid > ( select min ( rowid ) from ttt b where a. name= b. name) ;


2 rows deleted.
SQL> select * from ttt;
NAME
--------------------

ab
cd
ef

 

反过来也可以,找到重复行中最大的rowid,然后删除所有比他小的

 


SQL> select * from ttt;

NAME
--------------------

ab
ab
cd
cd
ef
cd

6 rows selected.

SQL> delete from ttt a where rowid < ( select max ( rowid ) from ttt b where a. name= b. name) ;

3 rows deleted.

SQL> select * from ttt;

NAME
--------------------

ab
ef
cd

SQL>

 

还有一个方案:

新建表,但是要记得重新建立索引,约束,触发器等


SQL> create table tttt as select distinct * from ttt;

Table created.

SQL> select * from tttt;

NAME
--------------------

ab
ef
cd

SQL> drop table ttt;

Table dropped.


SQL> rename tttt to ttt;

Table renamed