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
。这可能意味着向您正在 UNION
ing...
的集合添加一个额外的字段
SELECT 1 AS source, x, y FROM z
UNION ALL
SELECT 2 AS source, a, b FROM c
ORDER BY source, x, y
我有 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
。这可能意味着向您正在 UNION
ing...
SELECT 1 AS source, x, y FROM z
UNION ALL
SELECT 2 AS source, a, b FROM c
ORDER BY source, x, y