深入分析实际机制:
DELETE FROM table_name A
这是一个标准的查询语句,用于从名为"table_name"的表中删除记录。在子查询中,它被别名为"A"。
WHERE ROWID >
这将对删除操作施加一个条件,即对于遇到的每一行,其ROWID必须满足大于某个条件。
(SELECT min(rowid)
FROM table_name B
WHERE A.key_values = B.key_values)
这是一个与主DELETE语句相关的子查询。它使用外部查询的值A.key_values
。因此,给定DELETE语句中的一条记录,它将运行此子查询,以查找在同一表中(现在别名为B)承载相同key_values
值的所有记录的最小rowid(内部记录id)。
因此,综合起来,假设你有以下行:
rowid | key_values
======= ============
1 A
2 B
3 B
4 C
5 A
6 B
子查询根据具有相同“key_values”的所有记录计算出每个记录的最小rowid为:
rowid | key_values | min(rowid)
======= ============ ===========
1 A 1
2 B 2
3 B 2 **
4 C 4
5 A 1 **
6 B 2 **
对于带有**
标记的记录,条件为:
WHERE ROWID > { subquery }
变为真,它们将被删除。
编辑-额外信息
此答案先前声明ROWID按插入顺序增加。这是非常不正确的。事实是rowid只是一个文件.块.块上的插槽-一个物理地址
。
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:53140678334596
Tom的后续 2008年12月1日-中央时区早上6点:
很可能D将成为表中的“第一”-因为它取代了A的位置。
如果rowid始终“增长”,则永远不会重用空间(这是rowid始终增长的含义之一-我们将无法重用旧空间,因为rowid只是一个文件.块.块上的插槽-一个物理地址)