簡體   English   中英

它不能對多個 UNION sql 進行排序

[英]It can't sort multiple UNION sql

我用 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
;

我在互聯網上搜索,但找不到任何原因。

五年前我也有同樣的問題,問當時的 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 的每個成員中給列一個別名——相同的別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM