删除Oracle DB中的重复行

时间:2014-07-08 12:27:08

标签: sql oracle duplicate-removal

我在互联网上搜索但未能在下面找到我的问题的任何解释。 当我尝试从测试表中删除重复行时,以下代码不起作用。 测试表上没有唯一或主键,定义为test(id号)。你能解释一下为什么它不起作用吗?

delete from test a 
where a.rowid in (select b.rowid 
                  from test b 
                  where b.id = a.id 
                  and b.rowid != a.rowid);

2 个答案:

答案 0 :(得分:2)

此查询的正常工作方式更像是:

delete from test a 
where a.rowid > (select min(b.rowid)
                 from test b 
                 where b.id = a.id
                );

由于相关性,您的查询不会删除任何行。您要求a.rowid位于b.rowid != a.rowid排除明确的列表中。因此,没有行可以匹配这种情况 - 在列表中它们被明确排除在外。

答案 1 :(得分:1)

这应该有所帮助:

delete from test where rowid in
(
    select rowid from
      (select rowid,rank() over (partition by id order by rowid) rank 
       from test)temp_test 
    where temp_test.rank >1
);