您的位置:首页 > 数据库 > Oracle

Oracle中删除重复记录

2009-01-07 13:33 253 查看
查找重复记录,比如sprojid是区分记录的key
SQL> select "YSZC115"."TBCDB0"."SPROJID"
2 from "YSZC115"."TBCDB0" group by sprojid having count(sProjID)>1;

SPROJID
------------------------------
0020000200603003001
0020000200603003002
0020000200603003008
0020000200603003009
0020000200603003011
0020000200603003012
0020000200603003013
0020000200603003014
0020000200603003017
0020000200603003020
0020000200603003022

SPROJID
------------------------------
0020000200603003024
0020000200603003025
0020000200603003027

已选择14行。

实际存在的记录:
SQL> select sProjID from yszc115.tbcdb0 where sProjID in (select "YSZC115"."TBCD
B0"."SPROJID"
2 from "YSZC115"."TBCDB0" group by sprojid having count(sProjID)>1);

SPROJID
------------------------------
0020000200603003001
0020000200603003001
0020000200603003002
0020000200603003002
0020000200603003008
0020000200603003008
0020000200603003009
0020000200603003009
0020000200603003011
0020000200603003011
0020000200603003012

SPROJID
------------------------------
0020000200603003012
0020000200603003013
0020000200603003013
0020000200603003014
0020000200603003014
0020000200603003017
0020000200603003017
0020000200603003020
0020000200603003020
0020000200603003022
0020000200603003022

SPROJID
------------------------------
0020000200603003024
0020000200603003024
0020000200603003025
0020000200603003025
0020000200603003027
0020000200603003027

已选择28行。

删除重复的

SQL> delete yszc115.tbcdb0 where sProjID in (select "YSZC115"."TBCDB0"."SPROJID"

2 from "YSZC115"."TBCDB0" group by sprojid having count(sProjID)>1) and
rowid not in
3 (select min(rowid) from yszc115.tbcdb0 group by sprojid having count(sProjI
D)>1);

已删除14行。

删除重复记录的方法原理:
(1).在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。

  (2).在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: