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]