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

Sql 与外部查询具有相同源表的内部查询,sql,oracle,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)

我浏览了一些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
                       );
据我所知,应该首先运行内部查询(如果我错了,请纠正我),然后将内部查询结果用于外部查询

对于上面的查询,内部查询如何运行,因为它需要来自外部查询的数据(来自alias TableA的数据)

希望在这方面有一些指导,因为我对PL/SQL开发非常熟悉


谢谢

它不是PL/SQL,只是经典的SQL语句。 目的是
检索所有不是“最后版本”的行(对于一对pk1和对象标识符,最大的rowid)

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


在执行过程方面,您可以查看explain计划以了解oracle将要做什么

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

  • 运行外部查询
  • 对于另一个查询中的每一行,使用
    a.*
    列的特定值运行内部查询
  • 如果该行的内部查询没有返回任何内容,则将外部查询行输出到结果集
  • 旁白:
    MAX(ROWID)
    是个坏主意。ROWID是Oracle的内部标识符,表示磁盘上某一行的位置。这就像在C中取一些指针的最大值,并赋予其意义。Oracle可能决定将行放在任何位置,因此此查询的结果基本上是随机的。看见