删除重复行背后的逻辑



删除重复行背后的逻辑是什么?我知道这是一个用来删除重复行的查询。

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消除的结果)

我的疑问是,如果这两者结合在一起,我会得到一张没有重复的精确表格,为什么会这样?

您是否在问第一个查询是否有效?

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查询将删除它们。

我希望这是有道理的。这里有关于子查询(包括相关的子查询)的更多信息。

最新更新