删除重复行背后的逻辑是什么?我知道这是一个用来删除重复行的查询。
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
查询将删除它们。
我希望这是有道理的。这里有关于子查询(包括相关的子查询)的更多信息。