繁体   English   中英

Oracle SQL Query在12C但不在11g中工作

[英]Oracle SQL Query working in 12C but not in 11g

我有一个Oracle SQL查询在12C中工作正常,但在11g中没有。 我在下面给出了一个类似的例子。 请解释这是否是12C中修复的错误/增强功能。

CREATE TABLE MSI_OWNER.VINOTH_TEST1
(
  COL1  VARCHAR2(100 BYTE),
  SAL   NUMBER,
  YEAR  NUMBER
)

Insert into MSI_OWNER.VINOTH_TEST1   (COL1, SAL, YEAR) Values   ('Vinoth', 100, 1);
Insert into MSI_OWNER.VINOTH_TEST1   (COL1, SAL, YEAR) Values   ('Vinoth', 100, 2);
COMMIT;

  SELECT col1,
         (SELECT MAX (its)
            FROM (SELECT MAX (year) its
                    FROM vinoth_test1 x
                   WHERE x.col1 = a.col1))
            max_year,
         sal
    FROM vinoth_test1 a
GROUP BY col1, sal

请注意,我已经写了一个不同的逻辑来解决这个问题,但我想知道这是11g中的错误还是12C中的增强。

Error in 11g: ORA-00904: "A"."COL1": invalid identifier

在任一数据库中,您都可以将其写为:

select col1, sal,
       max(max(year)) over (partition by col1)
from vinoth_test1
group by col1, sal;

不需要子查询。 如前所述,您不需要附加级别的子查询。 无论如何 ,最里面的子查询只返回一行。

Oracle只允许对子查询中的直接父级进行相关引用 - 而不是更高级别的父级。 这似乎认为您的查询不适用于任何版本的Oracle。 但是,我认为Oracle 12c 实施此规则之前会进行一些优化。 文件提到了这一点:

当嵌套子查询引用从子查询上方一级的父语句引用的表中的列时,Oracle会执行相关子查询。 对于父语句处理的每一行,概念上对相关子查询进行一次计算。 但是, 优化器可以选择将查询重写为连接,或者使用其他技术来制定语义上等效的查询 Oracle通过查看子查询中指定的表,然后查找父语句中指定的表,解析子查询中的非限定列。

我怀疑这个优化是删除你不必要的子查询,因此允许查询编译。

Oracle文档始终明确表示只允许一个级别的关联(尽管没有明确的原因,并且它违反了SQL标准)。

正如其中一位大师Solomon Yakobson在OTN上多次解释,在每个新版本中,在子版本1中(如10.1,11.1),更深层次的关联工作正常,就像OP注意到的那样。 它曾经在子版本2(10.2,11.2)中被“修复”(灵活性被收回)。 12.1具有相同的“增强”(所有级别的相关性),12.2没有把它拿走 - 尽管文档STILL表示相关性不允许超过一个级别。 特别是因为当我们使用WITH子句编写查询时不存在这样的限制,因此Oracle继续使用该限制是没有意义的。

https://docs.oracle.com/database/122/SQLRF/Using-Subqueries.htm#SQLRF52357

当嵌套子查询引用一个表中的一个列时,Oracle执行一个相关子查询,该表引用一个父语句,该语句高于子查询一级 [...]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM