一,如何删除表中重复的行?
思路:记录虽然存在重复,但是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.
|
阅读(988) | 评论(0) | 转发(0) |