資源描述:
《Oracle中用Rowid查找和刪除重復(fù)記錄.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Oracle中用Rowid查找和刪除重復(fù)記錄平時(shí)工作中可能會(huì)遇到當(dāng)試圖對(duì)庫(kù)表中的某一列或幾列創(chuàng)建唯一索引時(shí),系統(tǒng)提示ORA-01452:不能創(chuàng)建唯一索引,發(fā)現(xiàn)重復(fù)記錄。下面總結(jié)一下幾種查找和刪除重復(fù)記錄的方法(以表CZ為例):表CZ的結(jié)構(gòu)如下:SQL>descczNameNull?Type-----------------------------------------C1NUMBER(10)C10NUMBER(5)C20VARCHAR2(3)刪除重復(fù)記錄的方法原理:(1).在Oracle中,每一條記錄都有一
2、個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫(kù)中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個(gè)數(shù)據(jù)文件、塊、行上。(2).在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中那些具有最大rowid的就可以了,其余全部刪除。重復(fù)記錄判斷的標(biāo)準(zhǔn)是:C1,C10和C20這三列的值都相同才算是重復(fù)記錄。經(jīng)查看表CZ總共有16條記錄:SQL>setpagesize100SQL>select*fromcz;C1C10C20-----------------------12dsf12d
3、sf12dsf12dsf23che12dsf12dsf12dsf12dsf23che23che23che23che34dff34dff34dff45err53dar61wee72zxc20rowsselected.1.查找重復(fù)記錄的幾種方法:(1).SQL>select*fromczgroupbyc1,c10,c20havingcount(*)>1;C1C10C20-----------------------12dsf23che34dff(2).SQL>selectdistinct*fromcz;C1C10
4、C20-----------------------12dsf23che34dff(3).SQL>select*fromczawhererowid=(selectmax(rowid)?fromczwherec1=a.c1andc10=a.c10andc20=a.c20);C1C10C20-----------------------12dsf23che34dff2.刪除重復(fù)記錄的幾種方法:(1).適用于有大量重復(fù)記錄的情況(在C1,C10和C20列上建有索引的時(shí)候,用以下語(yǔ)句效率會(huì)很高):SQL>delete
5、czwhere(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).適用于有少量重復(fù)記錄的情況(注意,對(duì)于有大量重復(fù)記錄的情況,用以下語(yǔ)句
6、效率會(huì)很低):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>deletefromczawhererowid<(selectmax(rowid)fromczwh
7、erec1=a.c1andc10=a.c10andc20=a.c20);(3).適用于有少量重復(fù)記錄的情況(臨時(shí)表法):SQL>createtabletestasselectdistinct*fromcz;(建一個(gè)臨時(shí)表test用來(lái)存放重復(fù)的記錄)SQL>truncatetablecz;(清空cz表的數(shù)據(jù),但保留cz表的結(jié)構(gòu))SQL>insertintoczselect*fromtest;(再將臨時(shí)表test里的內(nèi)容反插回來(lái))(4).適用于有大量重復(fù)記錄的情況(Exceptioninto子句法):采用alte
8、rtable命令中的Exceptioninto子句也可以確定出庫(kù)表中重復(fù)的記錄。這種方法稍微麻煩一些,為了使用“excepeioninto”子句,必須首先創(chuàng)建EXCEPTIONS表。創(chuàng)建該表的SQL腳本文件為utlexcpt.sql。對(duì)于win2000系統(tǒng)和UNIX系統(tǒng),Oracle存放該文件的位置稍有不同,在win2000系統(tǒng)下,該腳本文件存放在$ORACLE_HOMEOra90rdbmsadmi