[英]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.