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

SSMS SQL - ORDER BY stops working when adding UNION ALL?

我有 3 个不同的查询,它们之间有一个 UNION ALL。对于其中一个查询,我正在尝试使用一个排序方式,当 运行 那个批次单独工作时,它会起作用,但是一旦我用 UNION 引入它的其余部分,排序就会停止工作,因为可以看图

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

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

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

结果集排序只接受最后的 ORDER BY。尽管可以在 CTE、子查询、视图等中使用 TOP 子句指定 ORDER BY,但这些可能不一定用于结果排序,因此您需要在末尾添加 ORDER BY查询。

您应该在查询末尾添加另一个 "order by":

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

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

正如其他人提到的,SQL 是 "set based" 而 "set" 没有明确或隐含的顺序。只有在您提供特定的 ORDER BY 子句时,数据才会在从数据库返回到客户端时及时排序。

在这个例子中SQL使得没有保证返回给客户端的数据的顺序...

SELECT * FROM (SELECT x, y FROM z ORDER BY x, y) sub

即使有一个 ORDER BY 子句。外层查询的存在意味着内层查询中的排序是"out-of-scope"。它 可能 按您希望的顺序出现,只是不能保证 (并且在某些方言中会因此而出错).

同样,你的两个查询的顺序被它们的外部查询和中间的查询混淆了 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。这可能意味着向您正在 UNIONing...

的集合添加一个额外的字段
    SELECT 1 AS source, x, y FROM z
UNION ALL
    SELECT 2 AS source, a, b FROM c
ORDER BY source, x, y