簡體   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