Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解此SQL查询_Sql_Oracle_Sql Delete - Fatal编程技术网

理解此SQL查询

理解此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>

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

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的实际示例,而不是普通整数,但是这个概念已经很好地解释了。