2013-03-18 67 views
39

我試着下面給出的SQL查詢:如何在sql中使用與union的順序?

SELECT * FROM (SELECT * 
FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE 
UNION ALL 
SELECT * FROM TABLE_B 

它導致以下錯誤:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

我需要通過工會使用順序所有。我該如何做到這一點?

回答

68
SELECT * 
FROM 
     (
      SELECT * FROM TABLE_A 
      UNION ALL 
      SELECT * FROM TABLE_B 
     ) dum 
-- ORDER BY ..... 

,但如果你想有結果列表的頂部從Table_A所有的記錄,您可以添加用戶定義的值,你可以使用排序,

SELECT * 
FROM 
     (
      SELECT *, 1 sortby FROM TABLE_A 
      UNION ALL 
      SELECT *, 2 sortby FROM TABLE_B 
     ) dum 
ORDER BY sortby 
+0

非常感謝你解決了我的問題 – Wella 2013-03-18 07:47:39

+0

不用謝了':D'很高興幫助。 – 2013-03-18 07:48:48

+0

+1它幫了我很多。謝謝 – shashwat 2014-05-13 09:03:49

22

你不真的需要有括號。您可以直接排序:

SELECT *, 1 AS RN FROM TABLE_A 
UNION ALL 
SELECT *, 2 AS RN FROM TABLE_B 
ORDER BY RN, COLUMN_1 
+0

比選擇*子查詢更清潔。 – Nick 2015-09-09 20:30:20

+0

非常有用,尼克說,更乾淨。謝謝 – dajoto 2015-10-07 16:25:21

+0

這是否記錄在某處?我發現[在UNION文檔中的示例C](https://msdn.microsoft.com/en-us/library/ms180026.aspx),但它表明它可以完成,並且不解釋它。 – Trisped 2015-12-21 18:11:26

-5
Select 'Shambhu' as ShambhuNewsFeed,Note as [News Fedd],NotificationId 
from Notification with(nolock) where [email protected] 
Union All 
Select 'Shambhu' as ShambhuNewsFeed,Note as [Notification],NotificationId 
from Notification with(nolock) 
where [email protected] 
order by NotificationId desc 
5

不是一個操作的直接響應,但我想我會Jimmy在這裏響應了OP的錯誤訊息話題,因爲這可能指向你完全是另一方向!

所有這些答案都指的是整體 ORDER BY一旦記錄集已被檢索,並且你整理了很多。

如果你想獨立訂購UNION的每個部分,並且仍然讓它們在同一個SELECT中「加入」?

SELECT pass1.* FROM 
(SELECT TOP 1000 tblA.ID, tblA.CustomerName 
    FROM TABLE_A AS tblA ORDER BY 2) AS pass1 
UNION ALL 
SELECT pass2.* FROM 
    (SELECT TOP 1000 tblB.ID, tblB.CustomerName 
    FROM TABLE_B AS tblB ORDER BY 2) AS pass2 

注意TOP 1000是一個任意數字。使用足夠多的號碼來捕獲所有您需要的數據。