oracle中用rowid查找和删除重复记录

oracle中用rowid查找和删除重复记录

ID:15409195

大小:73.00 KB

页数:11页

时间:2018-08-03

oracle中用rowid查找和删除重复记录_第1页
oracle中用rowid查找和删除重复记录_第2页
oracle中用rowid查找和删除重复记录_第3页
oracle中用rowid查找和删除重复记录_第4页
oracle中用rowid查找和删除重复记录_第5页
资源描述:

《oracle中用rowid查找和删除重复记录》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Oracle中用Rowid查找和删除重复记录平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01452:不能创建唯一索引,发现重复记录。下面总结一下几种查找和删除重复记录的方法(以表CZ为例):表CZ的结构如下:SQL>descczNameNull?Type-----------------------------------------C1NUMBER(10)C10NUMBER(5)C20VARCHAR2(3)删除重复记录的方法原理:(1).在Oracle中,每一条

2、记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。(2).在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。重复记录判断的标准是:C1,C10和C20这三列的值都相同才算是重复记录。经查看表CZ总共有16条记录:SQL>setpagesize100SQL>select*fromcz;C1C10C20---------------------

3、--12dsf12dsf12dsf12dsf23che12dsf12dsf12dsf12dsf23che23che23che23che34dff1134dff34dff45err53dar61wee72zxc20rowsselected.1.查找重复记录的几种方法:(1).SQL>select*fromczgroupbyc1,c10,c20havingcount(*)>1;C1C10C20-----------------------12dsf23che34dff(2).SQL>selectdist

4、inct*fromcz;C1C10C20-----------------------12dsf23che34dff(3).SQL>select*fromczawhererowid=(selectmax(rowid) fromczwherec1=a.c1andc10=a.c10andc20=a.c20);C1C10C20-----------------------12dsf23che34dff2.删除重复记录的几种方法:(1).适用于有大量重复记录的情况(在C1,C10和C20列上建有索引的时候,

5、用以下语句效率会很高):SQL>deleteczwhere(c1,c10,c20)in(selectc1,c10,c20fromczgroupbyc1,c10,c20havingcount(*)>1)androwidnotin(selectmin(rowid)fromczgroupbyc1,c10,c20havingcount(*)>1);SQL>deleteczwhererowidnotin(selectmin(rowid)fromczgroupbyc1,c10,c20);(2).适用于有少量重复

6、记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):SQL>deletefromczawherea.rowid!=(selectmax(rowid)fromczbwherea.c1=b.c1anda.c10=b.c10anda.c20=b.c20);SQL>deletefromczawherea.rowid<(selectmax(rowid)fromczbwherea.c1=b.c1anda.c10=b.c10anda.c20=b.c20);SQL>deletefromczawher

7、erowid<(selectmax(rowid)fromczwherec1=a.c1andc10=a.c10andc20=a.c20);(3).适用于有少量重复记录的情况(临时表法):11SQL>createtabletestasselectdistinct*fromcz;(建一个临时表test用来存放重复的记录)SQL>truncatetablecz;(清空cz表的数据,但保留cz表的结构)SQL>insertintoczselect*fromtest;(再将临时表test里的内容反插回来)(4)

8、.适用于有大量重复记录的情况(Exceptioninto子句法):采用altertable命令中的Exceptioninto子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeioninto”子句,必须首先创建EXCEPTIONS表。创建该表的SQL脚本文件为utlexcpt.sql。对于win2000系统和UNIX系统,Oracle存放该文件的位置稍有不同,在win2000系统下,该脚本文件存放在$ORACLE_HOMEOra90rdbms

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。