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
子查询做什么?
剖析实际的力学:
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实际地址)
归档时间: |
|
查看次数: |
369 次 |
最近记录: |