![](/img/trans.png)
[英]Gridgain SQL query not working with union all and order by
[英]SSMS SQL - ORDER BY stops working when adding UNION ALL?
您應該在查詢的末尾添加另一個“ order by”:
Select * fom ( your queries ) order by...
SQL結果集表示無序集,除非您為最外面的select
指定一個order by
。 您可以order by
以下order by
執行您想要order by
:
SELECT cd.*
FROM ((SELECT C.URN , D.COLUMN2, D.COLUMN3, 1 as which
FROM TABLE1 C JOIN
TABLE2 D
ON C.1 = D.2
WHERE BLAH
) UNION ALL
(SELECT C.URN, D.COLUMN2, D.COLUMN3, 2 as which
FROM . . .
WHERE BLAH
)
) cd
ORDER BY WHICH, URN;
子查詢包含一個指示符,用於指定行來自哪個子查詢。 外部SELECT
將此信息用於ORDER BY
。
您必須對UNION ALL語句的結果應用Order by
SELECT * FROM (
SELECT * FROM T1
UNION ALL
SELECT * FROM T2
) Res
ORDER BY col
結果集排序僅接受最終的ORDER BY
。 盡管可以在CTE,子查詢,視圖等中使用TOP
子句指定ORDER BY
,但是這些未必可以用於結果排序,因此您需要在查詢的末尾添加ORDER BY
。
正如其他人提到的那樣,SQL是“基於集合”的,而“集合”沒有顯式或隱式排序。 僅當您提供特定的ORDER BY
子句時,數據才在從數據庫返回到客戶端的時間點進行排序。
在此示例中,SQL 不保證返回給客戶端的數據的順序。
SELECT * FROM (SELECT x, y FROM z ORDER BY x, y) sub
即使有一個ORDER BY
子句。 外部查詢的存在意味着內部查詢中的排序是“范圍外”。 它可能以您希望的順序出現,只是不能保證(因此某些方言會給出錯誤) 。
同樣,兩個查詢的順序被它們的外部查詢和中間的UNION ALL
所混淆。
還值得注意的是,在對多個集合進行UNION
時,您可以對結果進行ORDER
,而無需外部查詢...
SELECT x, y FROM z UNION ALL SELECT a, b FROM c ORDER BY x, y
(該順序適用於UNION
的結果,這就是為什么它引用了最終SELECT
甚至都不存在的字段名稱的原因。
為了提高可讀性,我更喜歡這種布局...
SELECT x, y FROM z
UNION ALL
SELECT a, b FROM c
ORDER BY x, y
要獲得所需的結果, 必須在最外面的查詢中指定ORDER BY
。 這可能意味着向您正在UNION
的集合中添加一個額外的字段...
SELECT 1 AS source, x, y FROM z
UNION ALL
SELECT 2 AS source, a, b FROM c
ORDER BY source, x, y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.