2

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

我有两个 select 语句,在任何地方都没有 order by 语句

我想联合他们有或没有(全部)

IE

SELECT A 
UNION (all) 
SELECT B

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

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

如果我使用:

SELECT A 
UNION ALL 
SELECT B

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

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

4

2 回答 2

7

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

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


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

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

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

于 2013-03-14T07:15:09.160 回答
3

One of the most important points to understand about SQL is that a table has no guaranteed order, because a table is supposed to represent a set (or multiset if it has duplicates), and a set has no order. This means that when you query a table without specifying an ORDER BY clause, the query returns a table result, and SQL Server is free to return the rows in the output in any order. If the results happen to be ordered, it may be due to optimization reasons. The point I'm trying to make is that any order of the rows in the output is considered valid, and no specific order is guaranteed. The only way for you to guarantee that the rows in the result are sorted is to explicitly specify an ORDER BY clause.

于 2013-03-14T07:15:45.573 回答