我用 Oracle19c 試過這個 sql。這是一個錯誤。(ORA-00904:“A”:無效識別符號)為什么會這樣?
SELECT a FROM t1
UNION
SELECT b FROM t2
UNION
SELECT c FROM t3
ORDER BY a;
此 sql 作業正常。
SELECT a FROM t1
UNION
SELECT b FROM t2
ORDER BY a;
SELECT a FROM t1
UNION
SELECT b FROM t2
UNION
SELECT c FROM t3
ORDER BY 1;
SELECT
A
FROM (
SELECT a FROM t1
UNION
SELECT b FROM t2
UNION
SELECT c FROM t3
)
ORDER BY A
;
我嘗試了這個 sql 并檢查了結果。這個結果的列名是“A”,所以我認為可以按“a”排序。
SELECT a FROM t1
UNION
SELECT b FROM t2
UNION
SELECT c FROM t3
;
我在互聯網上搜索,但找不到任何原因。
uj5u.com熱心網友回復:
五年前我也有同樣的問題,問當時的 Oracle 技術網是什么(名稱已更改,論壇軟體幾年前已更改,致命地破壞了所有格式......)無論如何,這里:
https://community.oracle.com/tech/developers/discussion/4025246/parser-bug-order-by-with-union-all-and-column-aliases
這是一個已知的錯誤,請參閱 Paulzip 的答案:
它在幾年前被記錄為錯誤 14196463,并在沒有解決的情況下關閉。
以及 CarlosDLG 的回答中的進一步澄清(執行緒中的最后一個)。
您可以在我在該主題的原始帖子(問題)中看到一些奇怪的事情。
簡短摘要:結果集將使用您為 UNION [ALL] 的第一個分支提供的別名并忽略所有其他別名。在您的情況下,您沒有在三向 UNION 的任何成員中提供任何別名,因此結果集將使用第一列名稱。
但是,由于只有 Oracle 知道的原因,ORDER BY 參考了在多個 UNION 的倒數第二個成員中給出的別名。該別名必須存在,并且它還必須與賦予 UNION 的第一個成員的別名相匹配。所以,奇怪的是(一個錯誤!),你必須給列一個別名,至少在 UNION 的第一個和倒數第二個成員中,別名必須相同。
除此之外,您可以使用其他解決方案作為解決方法(例如,將整個 UNION 包裝為子查詢并將 ORDER BY 放在外部查詢中)。不過,似乎最有意義的是——盡管它是更多型別的輸入——是在 UNION 的每個成員中給列一個別名——相同的別名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/492340.html
