我有三个不同的查询,它们之间有一个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 (
....
答案 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