我正在使用以下查询从表中删除重复的行。表中只有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