gpt4 book ai didi

sql - 理解这个 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 14:14:12 24 4
gpt4 key购买 nike

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

DELETE FROM table_name A 
WHERE ROWID > (SELECT min(rowid)
FROM table_name B
WHERE A.key_values = B.key_values);

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

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

This is the Source查询的

最佳答案

剖析实际机制:

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)。值(value)。
所以,把它放在一起,假设你有这些行
rowid   |  key_values
======= ============
1 A
2 B
3 B
4 C
5 A
6 B
子查询根据具有相同 key_values 的所有记录计算出每条记录的 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 }
变为真,并被删除。
编辑 - 附加信息
这个答案之前说过 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 点:

it is quite possible that D will be "first" in the table - as it took over A's place.

If rowids always "grew", than space would never be reused (that would be an implication of rowids growing always - we would never be able to reuse old space as the rowid is just a file.block.slot-on-block - a physical address)

关于sql - 理解这个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com