【问题标题】:Oracle 12c documentation for changes / new features to SQL用于 SQL 更改/新功能的 Oracle 12c 文档
【发布时间】:2017-10-10 14:49:23
【问题描述】:

我刚刚发现 Oracle 12c 支持将查询关联到多个级别,这在 11g 和以前的版本中是不支持的。

select
   *
from
   tab1 a
where
   not exists
         (select
                *
           from
               (select
                    *
                from
                    tab2 b
                where a.X = b.X))

但我在 Oracle 网站上找不到此文档。 Oracle 12c 中是否添加了任何其他此类隐藏的 SQL 功能? 12c 中对 SQL 的所有此类更改是否都记录在某处?

【问题讨论】:

  • 每个版本都附带一个“新功能指南”:docs.oracle.com/database/121/NEWFT/toc.htm 但是我找不到任何与此更改匹配的参考。
  • @a_horse_with_no_name 是的,我在发布之前也检查了这些文档。我现在感觉这是 Oracle 遗漏文档的一个案例(关于改变 SQL 的如此重要的特性!)。
  • 如果我是你,我不会依赖这个功能;这可能不是预期的行为(即错误)。

标签: sql oracle oracle11g oracle12c


【解决方案1】:

为了解释这一点,我们需要深入了解一下历史。

在 Oracle 10g R1 中也可以使用超过 1 个级别的相关子查询,并且在当时已正确记录 (https://docs.oracle.com/cd/B14117_01/server.101/b10759/queries007.htm)...

Oracle 在嵌套子查询时执行相关子查询 从引用父语句的表中引用列 any 子查询之上的层数

...但它无法正常工作。 :)

因此,从 Oracle 10g R2 开始,此功能被禁用并且文档已更改。

另外(如果您有访问权限)您可以在 Metalink 上看到 错误 15990897:使用 ORA-904 的 2ND LEVEL 子查询中使用的相关变量查询失败在产品版本 12.1 中修复。 0.1.0)。我不确定为什么它被认为是一个错误,因为它根据文档(10g R2、11g R1、11g R2)工作,但事实就是这样。

因此,功能在 10.1 之后和 12.1 之前被禁用,但即使是 12.2 (https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Using-Subqueries.html) 的文档也说

Oracle 在嵌套子查询时执行相关子查询 从引用父语句的表中引用列 one 高于子查询的级别。

长话短说,此功能在 12c R1 和 12c R2 中启用,但文档未修复,显然新功能指南中没有提及此改进。

附言。据我记得标准 SQL 2003 只允许关联到一个深度 - 欢迎大家检查 (http://www.wiscorp.com/sql_2003_standard.zip)。 但无论如何,Oracle 在标准之上有很多改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2022-11-10
    • 2014-10-01
    相关资源
    最近更新 更多