Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99879
  • 博文数量: 26
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 295
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-06 01:47
文章分类

全部博文(26)

文章存档

2009年(7)

2008年(19)

我的朋友

分类: Oracle

2009-03-04 23:06:14

一,如何删除表中重复的行?
 
思路:记录虽然存在重复,但是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.

阅读(967) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~