Oracle數據(jù)庫中去除重複數據的解決方案
在平(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