理解此SQL查询
我是oracle数据库的新手,可以帮助我理解这个查询吗。此查询消除表中的重复项理解此SQL查询,sql,oracle,sql-delete,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); 欢迎提出任何改进查询的建议。 编辑:不,这不是家庭作业,我不明白的是,子查询正在做什么,子查询上的ROWID>
DELETE FROM table_name A
WHERE ROWID > (SELECT min(rowid)
FROM table_name B
WHERE A.key_values = B.key_values);
欢迎提出任何改进查询的建议。
编辑:不,这不是家庭作业,我不明白的是,子查询正在做什么,子查询上的ROWID>做什么
查询中的引用:
rowid在插入时分配给行,并且是不可变的(从不更改)。。。除非吵架
被删除并重新插入(意味着它是另一行,而不是同一行!)
您提供的查询依赖于该rowid,并根据每个key\u值删除rowid值高于最小值的所有行。因此,将删除任何重复项
您提供的子查询是相关子查询,因为子查询中的表引用与子查询外部的表引用之间存在关系 Rowid
是一个伪列,它唯一地标识表中的每一行;它是数字的
此查询查找A
中的所有行,其中A.key\u values=B.key\u values
并删除所有行,只有一行的rowid
最小。这只是一种任意选择一个要保留的副本的方法。ROWID
是一个数字,它为插入的每一新行递增。因此,如果您有两个ROWID
数字16和24,您就知道16是在24之前插入的。您的delete
语句正在删除所有重复项,只保留插入的第一个重复项。有意义???剖析实际力学:
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\u值
。因此,给定DELETE语句中的一条记录,它将运行此子查询,以查找同一表(现在别名为B)中具有相同key\u值的所有记录的最小rowid(内部记录id)
所以,把它放在一起,假设你有这些行
rowid | key_values
======= ============
1 A
2 B
3 B
4 C
5 A
6 B
子查询计算出基于具有相同key\u值的所有记录的每条记录的min(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 }
将变为true,并将其删除
编辑-其他信息
这个答案之前指出ROWID按插入顺序增加。这是非常不真实的。事实上,rowid只是一个file.block.slot-on-block-一个物理地址
Tom的后续行动2008年12月1日-中部时区上午6点:
很有可能D将是表格中的“第一位”——因为它取代了A的位置
如果rowid总是“增长”,那么空间将永远不会被重用(这意味着rowid总是在增长-我们将永远无法重用旧空间,因为rowid只是一个file.block.slot-on-block-一个物理地址)
问题中有什么你不明白的?这是家庭作业吗?@Frederik Wordenskjold家庭作业警察?不是家庭作业,子查询中实际执行的是什么?你需要仔细阅读相关子查询@arex1337,这会浪费我的时间。我在问一个问题,就这么简单。你怎么会这么想?家庭作业警察?-1这是错误的。ROWID采用特定的格式,通常不会“为每一新行递增”。请参见示例,谢谢您的更正。在这种情况下,它唯一地标识一行并具有可比性(具有严格的顺序)就足够了。删除“插入第一行之后”的重复项是不正确的。rowid不能保证按插入顺序上升;事实上,通常不是。很好的解释。我本应该展示rowid的实际示例,而不是普通整数,但是这个概念已经很好地解释了。