与外部查询具有相同源表的内部查询
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.*
列的特定值运行内部查询
如果该行的内部查询未返回任何内容,则将外部查询行输出到结果集
【讨论】:
以上是关于与外部查询具有相同源表的内部查询的主要内容,如果未能解决你的问题,请参考以下文章
选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列