0

我不能使用公用表表達式:如何按多個聯合聲明的結果排序?

WITH cte 
      AS (SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB1].[dbo].[ProcessingStations] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB2].[dbo].[ProcessingStations] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB3].[dbo].[ProcessingStations] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB4].[dbo].[ProcessingStations] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB5].[dbo].[ProcessingStations] 
       ORDER BY [StationID] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB6].[dbo].[ProcessingStations] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB7].[dbo].[ProcessingStations] 
       UNION ALL 
       SELECT [StationID], 
         [LastDistribution] 
       FROM  [DB8].[dbo].[ProcessingStations]) 
    SELECT * 
    FROM cte 
    ORDER BY StationID 

我怎麼會去這樣做呢?

+0

如何訂購記錄? – 2013-04-10 13:47:29

+0

從最低站號到聯盟中所有表中最高的站點。 – 2013-04-10 13:48:20

+0

把'ORDER BY'放在最後。例如:'SELECT ... UNION SELECT ... UNION SELECT ... ORDER BY ...' – valverij 2013-04-10 13:48:56

回答

4

只要把ORDER BY在你的SELECT ... FROM ... UNION ALL陳述鏈的末端:

SELECT [StationID], 
      [LastDistribution] 
      FROM  [DB1].[dbo].[ProcessingStations] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB2].[dbo].[ProcessingStations] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB3].[dbo].[ProcessingStations] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB4].[dbo].[ProcessingStations] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB5].[dbo].[ProcessingStations] 
      ORDER BY [StationID] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB6].[dbo].[ProcessingStations] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB7].[dbo].[ProcessingStations] 
      UNION ALL 
      SELECT [StationID], 
        [LastDistribution] 
      FROM  [DB8].[dbo].[ProcessingStations] 
ORDER BY StationID 

下面是一個簡單的例子,我在SSMS做:

DECLARE @a table (x int) 
DECLARE @b table (x int) 
DECLARE @c table (x int) 

insert into @a values (5) 
insert into @a values (4) 
insert into @a values (3) 

insert into @b values (0) 
insert into @b values (1) 
insert into @b values (2) 

insert into @c values (0) 
insert into @c values (1) 
insert into @c values (2) 

select * from @a 
union all 
select * from @b 
union all 
select * from @c 
order by x 

而這裏的輸出:

x 
----- 
    0 
    0 
    1 
    1 
    2 
    2 
    3 
    4 
    5 

正如你可以看到,即使SELECT * FROM @a來到第一,但它仍然放在那些最後的結果集

+0

這不起作用。它只會訂購聯合中的最後一個表。 – 2013-04-10 13:56:53

+1

@Rj你爲什麼這麼想?你試過了嗎? – 2013-04-10 13:59:47

+2

@Rj。 - 這是不正確的。 'UNION'或'UNION ALL'鏈末尾的'ORDER BY'對* entire *'UNION'應用排序。 – 2013-04-10 13:59:53

2

爲什麼不能使用CTE?無論如何,你仍然可以做同樣的使用派生表:

SELECT * 
FROM ( SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB1].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB2].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB3].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB4].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB5].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB6].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB7].[dbo].[ProcessingStations] 
     UNION ALL 
     SELECT [StationID], 
        [LastDistribution] 
     FROM  [DB8].[dbo].[ProcessingStations]) A 
ORDER BY StationID 
+0

Downvoter care to comment? – Lamak 2013-04-10 13:49:39

+0

即時得到這個錯誤與你所說的(順便說一下,我不是downvoter) - 消息1033,級別15,狀態1,行22 ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式,除非TOP或FOR XML也被指定。 Msg 102,Level 15,State 1,Line 33 ')'附近的語法不正確。 – 2013-04-10 13:50:47

+0

@Rj。你使用的是什麼版本的SQL Server? – Lamak 2013-04-10 13:52:25

0

fiddle,只是把ORDER BY上的最後一組是「聯合在一起」。它在沒有CTE開銷的情況下達到相同的結果。

該命令將影響整個統一集。

SELECT 
     [StationID], 
     [LastDistribution] 
    FROM 
     [dbo].[ProcessingStations] 
UNION ALL 
SELECT 
     [StationID], 
     [LastDistribution] 
    FROM 
     [dbo].[ProcessingStations] 
UNION ALL 
SELECT 
     [StationID], 
     [LastDistribution] 
    FROM 
     [dbo].[ProcessingStations] 
    ORDER BY 
     [StationID]