与外部查询具有相同源表的内部查询

Posted

技术标签:

【中文标题】与外部查询具有相同源表的内部查询【英文标题】:Inner query with same source table as Outer Query 【发布时间】:2015-07-15 02:48:32 【问题描述】:

我浏览了一些 PL/SQL 代码,发现了一段查询,但我并没有真正了解它是如何工作的。希望能从这里得到一些技术建议。

查询如下:

SELECT a.ROWID
  FROM TableA a
 WHERE a.object_name IN ('HEADERS','LINES','DELIVERIES')
   AND a.change_type IN ('A','C')
   AND a.ROWID NOT IN (SELECT MAX (b.ROWID)
                         FROM TableA b
                        WHERE b.object_name       = a.object_name
                          AND b.change_type       = a.change_type
                          AND b.pk1               = a.pk1
                          AND b.object_identifier = a.object_identifier
                       );

据我所知,内部查询应该首先运行(如果我错了请纠正我),然后内部查询结果将用于外部查询。

对于上述查询,内部查询如何运行,因为它需要来自外部查询的数据(来自别名 TableA a 的数据)。

希望对这方面有一些指导,因为我对 PL/SQL 开发非常陌生。

谢谢!

【问题讨论】:

旁白:MAX(ROWID) 是个坏主意。 ROWID 是 Oracle 用于磁盘上行位置的内部标识符。这就像在 C 中取某些指针的最大值,并为其赋予意义。 Oracle 可能决定将该行放在任何位置,因此该查询的结果基本上是随机的。见***.com/questions/435109/… 【参考方案1】:

它不是 PL/SQL,只是经典的 SQL 语句。 目的接缝是 retrieve all the lines which are not the "last version" (biggest rowid for a couple pk1 and object_identifier)

“不在”部分将检索一对(pk1 和 object_identifier)的最大 rowid,然后,外部查询将检索所有不是最大 rowid 的行

在执行过程方面,可以看一下explain plan,看看oracle要做什么。

【讨论】:

【参考方案2】:

内部查询不首先运行。从概念上讲,你可以认为它是这样运行的:

    运行外部查询, 对于另一个查询中的每一行,使用 a.* 列的特定值运行内部查询 如果该行的内部查询未返回任何内容,则将外部查询行输出到结果集

【讨论】:

以上是关于与外部查询具有相同源表的内部查询的主要内容,如果未能解决你的问题,请参考以下文章

选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列

MariaDB 10.3 解决掉了UPDATE不能在同一表中查询的数据作为同一表的更新

具有 IN 和 NOT IN 条件的单个表的内部查询

F# 查询表达式是不是具有与本机 SQL 相同的性能?

sql-多表查询JOIN与分组GROUP BY

Hive 外部表架构重新连接