添加UNION ALL时SSMS SQL-ORDER BY停止工作?
我有3个不同的查询,它们之间都有一个联合。对于其中一个查询,我试图使用order by,它在单独运行该批处理时起作用,但一旦我介绍了它的其余部分与联合,排序就停止了,如图所示 SQL如下所示:添加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
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”结束,这是一个令人尴尬的简单解决方案。谢谢。