1. 程式人生 > 實用技巧 >oracle,Mysql 查詢,刪除重複資料

oracle,Mysql 查詢,刪除重複資料

Oracle

1.查詢某欄位重複資料

select欄位1,欄位2,count(*)from表名groupby欄位1,欄位2havingcount(*) > 1

2.刪除某欄位重複資料

刪除所有

deletefrom表名 awhere欄位1,欄位2in (select欄位1,欄位2,count(*)from表名groupby欄位1,欄位2havingcount(*) > 1)

上面的SQL注意:語句非常簡單,就是將查詢到的資料刪除掉。不過這種刪除執行的效率非常低,對於大資料量來說,可能會將資料庫吊死。

建議先將查詢到的重複的資料插入到一個臨時表中,然後對進行刪除,這樣,執行刪除的時候就不用再進行一次查詢了。如下:

CREATE TABLE 臨時表 AS (select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) > 1)

上面這句話就是建立了臨時表,並將查詢到的資料插入其中。

下面就可以進行這樣的刪除操作了:

deletefrom表名 awhere欄位1,欄位2in(select欄位1,欄位2from臨時表);

留下一條記錄

oracle中,有個隱藏了自動rowid,裡面給每條記錄一個唯一的rowid,我們如果想保留最新的一條記錄,我們就可以利用這個欄位,保留重複資料中rowid最大的一條記錄就可以了。

使用ROWID查詢重複資料:

selecta.rowid,a.*from表名 a wherea.rowid != (selectmax(b.rowid)from表名 b wherea.欄位1 = b.欄位1and a.欄位2 = b.欄位2 )

括號中的SQL查詢出rowid最大的記錄,而外面就是查詢出除了rowid最大之外的其他重複的資料了。由此,我們要刪除重複資料,只保留最新的一條資料,就可以這樣寫了:

刪除重複資料(留下最大ROWID的一條)

deletefrom表名 awherea.rowid != (selectmax(b.rowid)from表名 b wherea.欄位1 = b.欄位1and a.欄位2 = b.欄位2 )
刪除重複資料(留下最小ROWID的一條) deletetab twheret.rowid > ( selectmin(t2.rowid)fromtab t2wheret.col2 = t2.col2andt.col8 = t2.col8 ) 當然,上面語句的執行效率是很低的,可以考慮建立臨時表,講需要判斷重複的欄位、rowid插入臨時表中,然後刪除的時候在進行比較。 createtable臨時表asselecta.欄位1,a.欄位2,MAX(a.ROWID) dataidfrom正式表 aGROUPBYa.欄位1,a.欄位2; deletefrom表名 a wherea.rowid != (selectb.dataidfrom臨時表 b wherea.欄位1 = b.欄位1and a.欄位2 = b.欄位2 ); commit;

對於完全重複記錄的刪除

對於表中兩行記錄完全一樣的情況,可以用下面語句獲取到去掉重複資料後的記錄: