我正在使用以下查詢從表中刪除重複的行。表中只有2列(col1和col2)。使用rowid從oracle數據庫中刪除重複的行?
delete from tab1 where rowid not in
(select min(rowid) from tab1 t group by col1, col2);
是否有任何問題,如一些副作用,如果我用這個查詢來刪除重複的行?
我正在使用以下查詢從表中刪除重複的行。表中只有2列(col1和col2)。使用rowid從oracle數據庫中刪除重複的行?
delete from tab1 where rowid not in
(select min(rowid) from tab1 t group by col1, col2);
是否有任何問題,如一些副作用,如果我用這個查詢來刪除重複的行?
此查詢無誤。在這個問題描述您可以短語它沒有ROWNUM:
據我所知,您的查詢將執行慢
這應該給你一個更好的性能
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
使用ROWID本身沒有錯。這就是Oracle的SQL Developer用於幾乎所有的內部查詢。 –
我認爲你現在基於rowid的方法是正確的。我的理解是,rowid是訪問數據的最快方法之一,因爲它是數據庫中該行的物理地址。湯姆基特贊同你的初始方法[詢問湯姆:刪除重複記錄](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1224636375004) – Wolf