-1

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

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

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

4

1 回答 1

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

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

于 2013-08-19T17:12:26.683 回答