簡體   English   中英

SSMS SQL-添加UNION ALL時ORDER BY停止工作嗎?

[英]SSMS SQL - ORDER BY stops working when adding UNION ALL?

在此處輸入圖片說明

我有3個不同的查詢,它們之間有一個UNION ALL。 對於其中一個查詢,我試圖使用order by,該命令在單獨運行該批處理時會起作用,但是一旦我在UNION中引入了其余查詢,該排序就會停止工作,如在圖片。

SQL如下所示:

SELECT CCR1.* FROM (
SELECT TOP 100 PERCENT
   C.URN , D.COLUMN2, D.COLUMN3
FROM TABLE1 C
   JOIN TABLE2 D ON C.1=D.2
WHERE BLAH
ORDER BY C.URN
) CCR1

UNION ALL

SELECT CCR2.* FROM (
....

您應該在查詢的末尾添加另一個“ 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.

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