删除重复行的逻辑是什么? 我知道这是用于删除重复行的查询。
delete from tvsemp e where rowid>(select min(rowid) from tvsemp m where e.ename=m.ename);
这时我划分了子查询,即select min(m.rowid) from tvsemp e, tvsemp m where e.ename=m.ename;
然后我得到结果,因为rowid是
MIN(M.ROWID)
___________________
AAAEDUAABAAAKiqAAP
然后是外部查询select ename from tvsemp emp where rowid>'AAAEDUAABAAAKiqAAP'
但是为此我得到n-1个结果(除了我使用'>'sin消除的那个)
我怀疑的是,如果将这两者结合起来,我会得到精确的表格而不重复为什么会这样?
答案 0 :(得分:3)
您是否询问第一个查询是否有效?
delete from tvsemp e
where rowid>(select min(rowid) from tvsemp m where e.ename=m.ename);
答案是肯定的。
至于它是如何工作的,你的子查询是一个相关子查询,这基本上意味着它引用了外部查询。 Oracle为tvsemp e
的每一行执行子查询,子查询中的e.ename = m.ename
将子查询的结果限制为ename
等于外部查询当前行中ename
的行。
获得n - 1
结果正是您想要的:如果有四行名称为Chay
,则您要删除其中三个。
换句话说,如果有四行名称为Chay
,则只有其中一行具有最小ROWID
值。其他三个ROWID
将高于最低值,因此DELETE
查询将删除它们。
我希望这是有道理的。有关子查询(包括相关子查询)here的更多信息。