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

时间:2015-07-15 02:48:33

标签: sql oracle

我查看了一些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开发方面非常新鲜。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

在执行过程中,您可以查看解释计划以了解oracle将要执行的操作。

答案 1 :(得分:0)

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

  1. 运行外部查询
  2. 对于其他查询中的每一行,使用a.*列的特定值运行内部查询
  3. 如果该行的内部查询没有返回任何内容,则将外部查询行输出到结果集