我在互联网上搜索但未能在下面找到我的问题的任何解释。 当我尝试从测试表中删除重复行时,以下代码不起作用。 测试表上没有唯一或主键,定义为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);
答案 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
);