ORACLE重複記錄處理已經在網上有一些簡單SQL可供使用,但感覺還有改進之處。
delete table1 where rowid not in (
select max(rowid) from table1 group by col1 ,col2 )
上述方法可以重複資料刪除的資訊,保留的是相同欄位中ROWID最大的那一條記錄。
但這種方法需要改進才能查詢沒有重複的號碼,讀者可能會想,我使用distinct可以去重,可這樣之後,你還需要通過去重記錄。
本文對重複記錄進行一些SQL進行簡單的介紹,僅限ORACLE。
查詢重複記錄資訊:
select * from yourtable where key in (
select key from yourtable group by key having count(key) >1)
order by key
查詢去掉重複記錄的結果集:
select *
from (select t.*, row_number() over(partition by key order by field1) rnk
from yourtable t
order by key) ot
where rnk = 1
這裡較靈活的是可以通過對組內資訊排名,以取應該保留的記錄。上例通過對key分組,並按field1欄位進行排序,以靈活選擇有用的資訊。
有了查詢,將重複記錄匯入到另外一個表就容易了:
create table another_table as
select .....
回到正題:如果重複資料刪除的記錄呢?
把查詢結果的關鍵字作為刪除條件就可以了:
delete table yourtable where key in (
select key
from (select key, row_number() over(partition by key order by field1) rnk
from yourtable t
order by key) ot
where rnk > 1)
看上去比別人給的方案複雜多了,如此只是增加了靈活的選擇重複記錄。
在此也只是提供了另外一種思路,請多多提意見批評指正。