2011-08-30 157 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