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

问题描述 投票:2回答:2

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

我有两个select语句,在任何地方都没有按语句排序

我希望无论有没有(全部)联合他们

SELECT A 
UNION (all) 
SELECT B

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

如果我使用“选择一个联合选择B”,结果的顺序与“选择A”不同

如果我使用:

SELECT A 
UNION ALL 
SELECT B

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

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

tsql sql-order-by union union-all
2个回答
7
投票

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

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


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

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

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


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.