1、Oracle的row_number() over函數消除重複的記錄 (此種適用于通過條件排序後再刪除,即對刪除的記錄有條件限制,而不僅是rowid最大或最小或重複的隨意一條)

 

select row_number()over(partition by a order by b) as no,a,b from test; 標識重復資料

 

delete from test where b in (select b from (select row_number()over(partition by a order by b) as no,a,b from test) where no>1); 通過標識查出來刪除




2、通過rowid來判斷

 

select max(rowid) from test group by id having count(*)>1; --找出重複記錄中rowid最大的記錄

 

delete from test where rowid not in (select max(rowid) from test group by id having count(*)>1); --通過rowid篩選,去掉其他重複的資料(此為篩選刪除,會保留rowid最大的一條) ****(注意:此語句只會保留重復資料中rowid最大的,重復資料中其他的rowid及非重復資料都會被刪除)www.it165.net




3、使用分組函數group by

 

select id,name from test group by id,name having count(id)>1;

 

delete from test where id in (select id from (select id,name from test group by id,name having count(id)>1)); --注意,這會刪除所有重複的資料,不會保留其中一條




4、distinct 對於小的表比較有用,只能放在開頭

 

select distinct name from test;




------------------------------------------------

 

刪除表中多餘的重複記錄(多個欄位),只留有rowid最小的記錄

 

delete from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)
注:在進行刪除時,不用rowid not in 則會將重複的都刪除,一條都不會保留。




查詢重複記錄,使用group by 分組,如:select name from test group by name having count(*)>1;

 

刪除重複記錄時,需要使用兩個條件:先選出再使用rowid篩選刪除,如delete from test where id in (select id from (select name,id from test group by name,id having(count(id)>1))) and rowid not in (select max(rowid) from test group by name,id having count(*)>1);




假如刪除時,不使用查詢重複記錄的條件,直接使用rowid刪除,有什麼區別?

 

區別:不先查詢出重複記錄,直接使用not in rowid刪除,只會保留重複記錄的其中一條,但只有一條的記錄(即不重複的資料)也會被刪除。即除了重複記錄的一條,其他(重複的其他記錄及未重複的記錄)都會被刪除,不對。

 

結論:在進行重復資料刪除操作時,需要加上兩個條件,如上所示,一個為查找所有的重複記錄,rowid只是用於保留重復資料中的一條
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()