了解此SQL查询

Sup*_*Man 5 sql oracle sql-delete

我是oracle数据库的新手,可以帮助我理解这个查询.此查询消除了表中的重复项.

DELETE FROM table_name A 
 WHERE ROWID > (SELECT min(rowid) 
                  FROM table_name B 
                 WHERE A.key_values = B.key_values);
Run Code Online (Sandbox Code Playgroud)

欢迎任何改进查询的建议.

编辑:不,这不是家庭作业,我不明白的是,子查询正在做什么以及ROWID > On子查询做什么?

这是查询的来源

Ric*_*iwi 5

剖析实际的力学:

DELETE FROM table_name A 
Run Code Online (Sandbox Code Playgroud)

这是从名为"table_name"的表中删除记录的标准查询.这里,它被别名为"A",在子查询中引用.

WHERE ROWID > 
Run Code Online (Sandbox Code Playgroud)

这为删除设置了一个条件,这样对于遇到的每一行,ROWID必须满足大于...的条件.

            (SELECT min(rowid) 
              FROM table_name B 
             WHERE A.key_values = B.key_values)
Run Code Online (Sandbox Code Playgroud)

这是一个与主DELETE语句相关的子查询.它使用A.key_values外部查询的值.因此,给定来自DELETE语句的记录,它将运行此子查询以查找具有相同key_values值的同一表中的所有记录(现在为别名为B)的最小rowid(内部记录ID).

所以,把它放在一起,说你有这些行

rowid   |  key_values
=======    ============
1          A
2          B
3          B
4          C
5          A
6          B
Run Code Online (Sandbox Code Playgroud)

子查询计算出每条记录的min(rowid)基于具有相同的ALL记录key_values:

rowid   |  key_values    | min(rowid)
=======    ============    ===========
1          A               1
2          B               2
3          B               2  **
4          C               4
5          A               1  **
6          B               2  **
Run Code Online (Sandbox Code Playgroud)

对于标有的记录**,条件

WHERE ROWID > { subquery }
Run Code Online (Sandbox Code Playgroud)

变为真,它们被删除.

编辑 - 其他信息

此答案之前表示ROWID因插入顺序而增加.这是非常不真实的.事实是这样的rowid is just a file.block.slot-on-block - a physical address.

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:53140678334596

汤姆的后续活动2008年12月1日 - 早上6点中央时区:

D很有可能在桌子上"第一" - 因为它接管了A的位置.

如果rowid总是"增长",那么空间将永远不会被重用(这将意味着rowid总是在增长 - 我们永远无法重用旧空间,因为rowid只是一个file.block.slot-on-block - a实际地址)