主頁 > 知識(shí)庫 > oracle快速刪除重復(fù)的記錄

oracle快速刪除重復(fù)的記錄

熱門標(biāo)簽:廣州市400電話辦理 淮安自動(dòng)外呼系統(tǒng)開發(fā) 修改高德地圖標(biāo)注 地圖標(biāo)注原件 語音電話機(jī)器人營銷方案 百變地圖標(biāo)注 宜賓外呼系統(tǒng)廠家 南通防封外呼系統(tǒng)運(yùn)營商 語音電話機(jī)器人缺點(diǎn)
正在看的ORACLE教程是:oracle快速刪除重復(fù)的記錄。做項(xiàng)目的時(shí)候,一位同事導(dǎo)數(shù)據(jù)的時(shí)候,不小心把一個(gè)表中的數(shù)據(jù)全都搞重了,也就是說,這個(gè)表里所有的記錄都有一條重復(fù)的。這個(gè)表的數(shù)據(jù)是千萬級(jí)的,而且是生產(chǎn)系統(tǒng)。也就是說,不能把所有的記錄都刪除,而且必須快速的把重復(fù)記錄刪掉。

對(duì)此,總結(jié)了一下刪除重復(fù)記錄的方法,以及每種方法的優(yōu)缺點(diǎn)。

為了陳訴方便,假設(shè)表名為Tbl,表中有三列col1,col2,col3,其中col1,col2是主鍵,并且,col1,col2上加了索引。

1、通過創(chuàng)建臨時(shí)表

可以把數(shù)據(jù)先導(dǎo)入到一個(gè)臨時(shí)表中,然后刪除原表的數(shù)據(jù),再把數(shù)據(jù)導(dǎo)回原表,SQL語句如下:

creat table tbl_tmp (select distinct* from tbl);truncate table tbl;//清空表記錄insert into tbl select * from tbl_tmp;//將臨時(shí)表中的數(shù)據(jù)插回來。 
這種方法可以實(shí)現(xiàn)需求,但是很明顯,對(duì)于一個(gè)千萬級(jí)記錄的表,這種方法很慢,在生產(chǎn)系統(tǒng)中,這會(huì)給系統(tǒng)帶來很大的開銷,不可行。

2、利用rowid

在oracle中,每一條記錄都有一個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫中是唯一的,rowid確定了每條記錄是oracle中的哪一個(gè)數(shù)據(jù)文件、塊、行上。在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同。SQL語句如下:

delete from tbl where rowid in (select a.rowid from tbl a, tbl b where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2) 
如果已經(jīng)知道每條記錄只有一條重復(fù)的,這個(gè)sql語句適用。但是如果每條記錄的重復(fù)記錄有N條,這個(gè)N是未知的,就要考慮適用下面這種方法了。

3、利用max或min函數(shù)

這里也要使用rowid,與上面不同的是結(jié)合max或min函數(shù)來實(shí)現(xiàn)。SQL語句如下

delete from tbl awhere rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//這里max使用min也可以 
或者用下面的語句

delete from tbl awhere rowid(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//這里如果把max換成min的話,前面的where子句中需要把""改為">" 
跟上面的方法思路基本是一樣的,不過使用了group by,減少了顯性的比較條件,提高效率。SQL語句如下:

deletefrom tbl where rowid not in (select max(rowid) from tbl tgroup by t.col1, t.col2);delete from tbl where (col1, col2) in (select col1,col2 from tblgroup bycol1,col2havingcount(*) >1)and rowidnotin(selectnin(rowid)fromtblgroup bycol1,col2havingcount(*) >1) 
還有一種方法,對(duì)于表中有重復(fù)記錄的記錄比較少的,并且有索引的情況,比較適用。假定col1,col2上有索引,并且tbl表中有重復(fù)記錄的記錄比較少,SQL語句如下4、利用group by,提高效率 

您可能感興趣的文章:
  • ORACLE查詢刪除重復(fù)記錄三種方法
  • oracle查詢重復(fù)數(shù)據(jù)和刪除重復(fù)記錄示例分享
  • 解決Oracle刪除重復(fù)數(shù)據(jù)只留一條的方法詳解
  • Oracle 查找與刪除表中重復(fù)記錄的步驟方法
  • oracle sql 去重復(fù)記錄不用distinct如何實(shí)現(xiàn)
  • oracle 刪除重復(fù)數(shù)據(jù)
  • 如何確定Oracle數(shù)據(jù)庫表重復(fù)的記錄
  • Oracle刪除重復(fù)的數(shù)據(jù),Oracle數(shù)據(jù)去重復(fù)

標(biāo)簽:池州 襄陽 南平 通化 股票投資 聊城 南平 嘉峪關(guān)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《oracle快速刪除重復(fù)的記錄》,本文關(guān)鍵詞  oracle,快速,刪除,重復(fù),的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《oracle快速刪除重復(fù)的記錄》相關(guān)的同類信息!
  • 本頁收集關(guān)于oracle快速刪除重復(fù)的記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章