2011-08-30 87 views
0

我正在使用以下查詢從表中刪除重複的行。表中只有2列(col1和col2)。使用rowid從oracle數據庫中刪除重複的行?

delete from tab1 where rowid not in 
(select min(rowid) from tab1 t group by col1, col2); 

是否有任何問題,如一些副作用,如果我用這個查詢來刪除重複的行?

+0

使用ROWID本身沒有錯。這就是Oracle的SQL Developer用於幾乎所有的內部查詢。 –

+0

我認爲你現在基於rowid的方法是正確的。我的理解是,rowid是訪問數據的最快方法之一,因爲它是數據庫中該行的物理地址。湯姆基特贊同你的初始方法[詢問湯姆:刪除重複記錄](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1224636375004) – Wolf

回答

2

據我所知,您的查詢將執行慢

這應該給你一個更好的性能

delete t1 
from tab1 t1 
join tab1 t2 
on t1.rowid > t2.rowid 
and t1.col1 = t2.col1 
and t1.col2 = t2.col2 

或者這個(它對mssql有效,我相信oracle有相同的語法)

;WITH [CTE DUPLICATE] AS 
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY id) RN 
FROM tab1 
) 
DELETE FROM [CTE DUPLICATE] WHERE RN > 1 
+0

'這應該給你一個更好的表現,只要你在字段'col1'和'col2' – Johan

+0

@Johan上有索引,即使沒有索引,我相信它會帶來更好的性能 –

+0

我明白你的意思,所有'group by '在原始查詢中進行。 – Johan

相關問題