删除重复行后的逻辑?

时间:2013-08-19 16:59:49

标签: sql oracle rowid

删除重复行的逻辑是什么? 我知道这是用于删除重复行的查询。

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消除的那个)

我怀疑的是,如果将这两者结合起来,我会得到精确的表格而不重复为什么会这样?

1 个答案:

答案 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的更多信息。