【问题标题】:how do I order by the results of multiple union statements?如何按多个联合语句的结果排序?
【发布时间】:2013-04-10 13:46:37
【问题描述】:

我不能使用公用表表达式:

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

我该怎么做呢?

【问题讨论】:

  • 记录如何排序?
  • 联合中所有表中从最低站号到最高站号。
  • ORDER BY放在最后。例如:SELECT ... UNION SELECT ... UNION SELECT ... ORDER BY ...

标签: sql sql-server sql-server-2008 sql-order-by common-table-expression


【解决方案1】:

只需将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 排在第一位,但它仍将最后的那些放在结果集中

【讨论】:

  • 这不起作用。它只对联合中的最后一个表进行排序。
  • @Rj。 - 这是不正确的。位于UNIONUNION ALLs 链末尾的ORDER BY 将排序应用于整个 UNION
  • @Rj,我添加了一个我在本地做的例子。据我所知,它运行良好。
【解决方案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

【讨论】:

  • 我得到了这个错误与你所说的(顺便说一句,我不是downvoter) - Msg 1033,Level 15,State 1,Line 22 ORDER BY 子句在视图,内联函数中无效,派生表、子查询和公用表表达式,除非还指定了 TOP 或 FOR XML。消息 102,级别 15,状态 1,第 33 行 ')' 附近的语法不正确。
  • @Rj。您使用的是什么版本的 SQL Server?
  • SQL Server 10.50.4000。那就是 SQL Server 2008 R2 Service Pack 2。
  • @Rj。抱歉,没有注意到您在其中一个子选择中有ORDER BY。试试更新的代码。
  • @Rj。你的服务器应该支持 CTE。它是在 SQL Server 2005 上引入的。你不能使用是什么意思?有人不让你用吗?
【解决方案3】:

查看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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多