Tsql,union更改结果顺序,union all都没有

时间:2013-03-14 06:48:35

标签: tsql sql-order-by union union-all

我知道UNION会删除重复项,但即使没有重复项,它也会更改结果顺序。

我有两个select语句,没有按语句排序

我希望在有或没有(全部)的情况下将他们联合起来

即。

SELECT A 
UNION (all) 
SELECT B

“选择B”实际上什么都不包含,不会返回任何条目

如果我使用“Select A union Select B”,结果的顺序与“Select A”不同

如果我使用:

SELECT A 
UNION ALL 
SELECT B

结果的顺序与“选择A”本身相同,并且“选择A”中没有重复。

这是为什么?这是不可预测的。

2 个答案:

答案 0 :(得分:7)

从SQL查询获取特定结果顺序的唯一方法是使用ORDER BY子句。其他任何事情只是依赖于巧合和您发出查询时服务器的特定(暂时)状态。

因此,如果您需要/需要特定订单,请使用ORDER BY


至于为什么它改变了结果的排序 - 首先,UNION(没有ALL)保证从结果中删除所有重复项 - 而不仅仅是重复项不同的查询 - 因此,如果第一个查询返回重复的行而第二个查询没有返回任何行,UNION仍然必须消除它们。

确定一堆结果中是否有重复项的一种常见,简单的方法是对这些结果进行排序(按照对系统最方便的排序顺序) - 这样,重复项最终会彼此相邻,所以然后,您可以迭代这些排序结果和if(results[index] == results[index-1]) skip;

因此,您通常会发现UNION(没有ALL)查询的结果已按任意顺序排序。但是,为了重新强调原点,应用的顺序没有定义,当然不应该依赖 - 软件的任何补丁,索引或统计数据的变化都可能导致系统在下一个选择不同的排序顺序查询执行的时间 - 除非有ORDER BY子句。

答案 1 :(得分:3)

理解SQL的最重要的一点是,表没有保证顺序,因为表应该表示一个集合(如果它有重复,则表示多集),而一个集合没有顺序。这意味着在查询表而未指定ORDER BY子句时,查询返回表结果,SQL Server可以按任意顺序自由返回输出中的行。如果结果恰好是有序的,则可能是由于优化原因。我想说的是,输出中任何行的顺序都被认为是有效的,并且没有保证特定的顺序。保证结果中的行被排序的唯一方法是显式指定ORDER BY子句。