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

添加UNION ALL时SSMS SQL-ORDER BY停止工作?,sql,sql-server,tsql,ssms,union-all,Sql,Sql Server,Tsql,Ssms,Union All,我有3个不同的查询,它们之间都有一个联合。对于其中一个查询,我试图使用order by,它在单独运行该批处理时起作用,但一旦我介绍了它的其余部分与联合,排序就停止了,如图所示 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 U

我有3个不同的查询,它们之间都有一个联合。对于其中一个查询,我试图使用order by,它在单独运行该批处理时起作用,但一旦我介绍了它的其余部分与联合,排序就停止了,如图所示

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

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

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

对于结果集排序,只有最终的排序依据。虽然可以在CTE、子查询、视图等中使用
TOP
子句指定
orderby
,但这些子句不一定用于结果排序,因此您需要将
orderby
添加到查询的末尾。

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

您应该在查询末尾添加另一个“ORDER BY”:

Select * fom ( your queries ) order by...
您应在查询结束时添加另一个“订购人”:

Select * fom ( your queries ) order by...
SQL结果集表示无序集,除非您为最外层的
select
指定
orderby
。您可以通过以下方式使用此
订单执行您想要的操作:

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

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

正如其他人所提到的,SQL是“基于集合的”,而“集合”没有显式或隐式排序。仅当数据从数据库返回到客户端时,并且仅当您提供特定的
orderby
子句时,数据才会变得有序

在本例中,SQL对返回到客户机的数据顺序作出保证

SELECT * FROM (SELECT x, y FROM z ORDER BY x, y) sub
即使有一个
ORDER BY
子句。外部查询的存在意味着内部查询中的排序“超出范围”。它可能会按照你希望的顺序出现,只是不能保证(在某些方言中会因此而出现错误)

类似地,两个查询的顺序也被它们的外部查询和中间的
UNION ALL
弄糊涂了

还值得注意的是,当
UNION
ing多个集合时,您可以
ORDER
结果,而无需外部查询

SELECT x, y FROM z UNION ALL SELECT a, b FROM c ORDER BY x, y
(排序适用于
联合
的结果,这就是为什么它引用的字段名在最终的
选择
中甚至不存在

为了可读性,我更喜欢这种类型的布局

    SELECT x, y FROM z
UNION ALL
    SELECT a, b FROM c
ORDER BY x, y
要获得所需的结果,必须在最外层查询中指定
ORDER BY

    SELECT 1 AS source, x, y FROM z
UNION ALL
    SELECT 2 AS source, a, b FROM c
ORDER BY source, x, y

正如其他人所提到的,SQL是“基于集合”的,“集合”没有显式或隐式排序。只有在数据从数据库返回到客户端的时间点,并且只有在您提供特定的
ORDER BY
子句时,数据才会被排序

在本例中,SQL对返回到客户机的数据顺序作出保证

SELECT * FROM (SELECT x, y FROM z ORDER BY x, y) sub
即使有一个
ORDER BY
子句。外部查询的存在意味着内部查询中的顺序“超出范围”。它可能会按照您希望的顺序出现,只是不能保证(在某些方言中,会因此产生错误)

类似地,两个查询的顺序也被它们的外部查询和中间的
UNION ALL
弄糊涂了

还值得注意的是,当
UNION
ing多个集合时,您可以
ORDER
结果,而无需外部查询

SELECT x, y FROM z UNION ALL SELECT a, b FROM c ORDER BY x, y
(排序适用于
联合
的结果,这就是为什么它引用的字段名在最终的
选择
中甚至不存在

为了可读性,我更喜欢这种类型的布局

    SELECT x, y FROM z
UNION ALL
    SELECT a, b FROM c
ORDER BY x, y
要获得所需的结果,必须在最外层查询中指定
ORDER BY

    SELECT 1 AS source, x, y FROM z
UNION ALL
    SELECT 2 AS source, a, b FROM c
ORDER BY source, x, y

Put ORDER BY after all查询unionPut ORDER BY after all查询unionAFAIK您不需要外部选择。在此SQLFIDLE中,排序适用于整个unioned集合,而不仅仅是最终组件。在每个批次中添加排序号列,并以“ORDER BY sort,urn”结束这是一个令人尴尬的简单解决方案。Thank.AFAIK您不需要外部选择。在这个SQLFIDLE中,排序适用于整个联合集合,而不仅仅是最终组件。在每个批次中添加一个排序号列,并以“order by sort,urn”结束,这是一个令人尴尬的简单解决方案。谢谢。