导航

(转)oracle 删除指定字段重复的记录

SQL> select * from t;

ID NAME SCORE
---------- ---------- ----------
3 smith 100
4 smith 100
5 jerry 80
6 tom 80
1 evan 100
2 evan 100
7 evan 100

已选择7行。

SQL> ed tmp.buf

SQL> --获取所有的记录,但name与score两者不能重复
SQL> --哪些字段相同,以哪些字段分组,然后获取其最小的id
SQL> select min(id) id,name,score from t group by name,score;

ID NAME SCORE
---------- ---------- ----------
6 tom 80
3 smith 100
1 evan 100
5 jerry 80

SQL> ed tmp.buf

SQL> --获取有重复记录的数据(有重复说明分组后count(*)>1),并且其id最小的记录
SQL> --哪些字段相同,以哪些字段分组,然后获取其最小的id
SQL> select min(id) id,name,score from t group by name,score having count(*) > 1;

ID NAME SCORE
---------- ---------- ----------
3 smith 100
1 evan 100

SQL> ed tmp.buf

SQL> --删除那些name与score重复的记录,只保留id最小的那一条
SQL> DELETE FROM t
2 WHERE t.ID NOT IN (SELECT MIN(id) AS id FROM t GROUP BY NAME, score);

已删除3行。

SQL> select * from t;

ID NAME SCORE
---------- ---------- ----------
3 smith 100
5 jerry 80
6 tom 80
1 evan 100

 

此外还可以使用临时表的方式,即将我们需要的数据(没有重复的数据)先放到临时表中,然后删除正式表中的数据,最后将临时表中的数据插入到正式表中。

posted on 2015-05-27 11:51  吉祥天  阅读(267)  评论(0)    收藏  举报