SSMS SQL - ORDER BY在添加UNION ALL时停止工作?

时间:2017-11-06 11:31:48

标签: sql sql-server tsql ssms union-all

enter image description here

我有三个不同的查询,它们之间有一个UNION ALL。通过其中一个查询,我试图使用一个order by,当它自己运行该批处理时可以正常工作,但是一旦我用UNIONs引入其余部分,订单就会停止工作,就像可以如图所示。

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 (
....

5 个答案:

答案 0 :(得分:2)

您应该在查询结尾添加另一个“order by”:

Select * fom ( your queries ) order by...

答案 1 :(得分:2)

SQL结果集表示无序集,除非您为最外面的order by指定select。你可以用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

答案 2 :(得分:1)

您必须对UNION ALL语句的结果应用Order by

SELECT * FROM (
    SELECT * FROM T1
    UNION ALL
    SELECT * FROM T2
) Res
ORDER BY col

答案 3 :(得分:1)

只有最终ORDER BY才能获得结果集排序。虽然可以在CTE,子查询,视图等中使用ORDER BY子句指定TOP,但这些子句可能不一定用于结果排序,因此您需要将ORDER BY添加到结尾查询。

答案 4 :(得分:1)

正如其他人所提到的,SQL基于"基于"和"设置"没有明确或隐含的排序。数据仅在从数据库返回到客户端的时间点进行排序,并且仅在您提供特定的ORDER BY子句时才会被排序。

在此示例中,SQL使 no 保证返回给客户端的数据顺序...

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