綠色資源網:您身(shēn)邊最(zuì)放心的安全下載站! 最新軟件|熱門排行|軟件分類|軟(ruǎn)件(jiàn)專題|廠商大全(quán)

綠(lǜ)色資源網

技術教程
您的位置:首頁數據庫類Oracle → Oracle數(shù)據(jù)庫(kù)中去除重複(fù)數據(jù)的解(jiě)決方案

Oracle數據(jù)庫中去除重複數據的解決方案

我要評論 2013/09/10 12:33:09 來源:綠色資(zī)源網 編輯:www.ynaad.com [大(dà) ] 評(píng)論:0 點擊:222次

在平(píng)時的開發中,我(wǒ)們經常遇到數據表中出現重複的數據,那麽該如何解決呢?這裏介紹兩種(zhǒng)情(qíng)況下的數據去重方法,一、完全重複數據去重;二、部分字段數據重(chóng)複去重。

一(yī)、完全(quán)重複數據去重方法

對於表中完全重複數(shù)據去重,可以采用以下SQL語句。

Code

CREATETABLE"#temp"AS (SELECTDISTINCT * FROM 表(biǎo)名);--創建臨時表,並把DISTINCT 去重後的數據插入(rù)到臨時表中

truncateTABLE 表名;--清(qīng)空原表數據

INSERTINTO 表名(SELECT * FROM"#temp");--將臨時表數(shù)據(jù)插入到原表中

DROPTABLE"#temp";--刪除臨時表

具體思(sī)路(lù)是,首(shǒu)先創建(jiàn)一個臨時表,然(rán)後將DISTINCT之後的表數據插入到這個臨時表中;然後(hòu)清空原表數據;再講臨(lín)時表中的數(shù)據插入到原(yuán)表中(zhōng);最後刪除臨(lín)時表。

二、部分數據去重方法

首先查找重複數據(jù)

select 字段(duàn)1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1

將上(shàng)麵的>號改為=號就可(kě)以查詢出沒有重複的(de)數據了。

想要刪除這些重複的數據,可以(yǐ)使用(yòng)下麵語句進行刪除:

deletefrom 表名(míng) a where 字段1,字段2 in

(select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1)

上麵的語句非(fēi)常簡(jiǎn)單,就是(shì)將查詢到的數據刪除掉。不過這種刪除執行的效率非常低,對於大數(shù)據量來說,可能會將數據庫卡死。

基於上述情況,可以先將查詢到的重複的數據插入到(dào)一個(gè)臨時表中,然後對(duì)進行刪除,這(zhè)樣,執行刪除的時候就不用再進行一次查詢了。如下:

CREATETABLE 臨時表 AS

(select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1)

下麵就可以進行這樣的(de)刪除操作(zuò)了:

deletefrom 表名 a where 字段1,字段2 in (select 字段1,字段2 from 臨時表);

先建臨時表再進行刪除的操作要比直接用一條(tiáo)語句進行刪除要高效得多。

上麵的語句會把(bǎ)所有重複的全都刪除,在oracle中,有個(gè)隱藏了自(zì)動(dòng)rowid,裏麵給每條記錄一個唯一的rowid,我們如果想保留最新的一條記錄,我們就(jiù)可以利用這個(gè)字段,保留重複(fù)數據中rowid最大的一條記錄就可(kě)以了。

下麵(miàn)是查(chá)詢重(chóng)複數據的一個(gè)例子:

select a.rowid,a.* from 表名 a

where a.rowid !=

(

selectmax(b.rowid) from 表名 b

where a.字段1 = b.字段1 and

a.字段2 = b.字段(duàn)2

)

上(shàng)麵括(kuò)號中的語句是查詢出重複數據中rowid最大的一條記(jì)錄。而外麵就是查詢出(chū)除了rowid最大之外的其他重複的數據(jù)了。

由此,我們(men)要刪除重(chóng)複數據,隻(zhī)保留(liú)最新(xīn)的一條數(shù)據,就可以這樣寫(xiě)了:

deletefrom 表名 a

where a.rowid !=

(

selectmax(b.rowid) from 表名 b

where a.字段1 = b.字段1 and

a.字段2 = b.字段2

)

同理,上述代碼的執行效率畢竟低,所以我們可以考慮建立臨時表(biǎo),將需要判斷重複的字段、rowid插(chā)入(rù)臨時表中,然後刪除(chú)的時候在進行比較(jiào)。

createtable 臨時(shí)表 as

select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUPBY a.字段1,a.字段2;

deletefrom 表名(míng) a

where a.rowid !=

(

select b.dataid from 臨時表 b

where a.字段1 = b.字段1 and

a.字段2 = b.字段2

);

commit;

關鍵詞:Oracle,數據庫,解決方案

閱讀本文後您有什麽感想? 已有 人給出評價!

  • 1 歡迎喜歡
  • 1 白癡
  • 1 拜托
  • 1 哇
  • 1 加油
  • 1 鄙視(shì)
免费人欧美成又黄又爽的视频丨一本色道久久88综合日韩精品丨国产专区日韩精品欧美色丨午夜无遮挡男女啪啪视频丨国产欧美日韩综合精品一区二区丨亚洲精品无码不卡在线播HE丨亚洲精品国产精品国自产观看丨日韩国产高清av不卡