Tsql,union 改变结果顺序,union all 不

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

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

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

我想将它们合并或不合并(全部)

SELECT A 
UNION (all) 
SELECT B

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

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

如果我使用:

SELECT A 
UNION ALL 
SELECT B

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

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

最佳答案

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

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


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

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

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

关于Tsql,union 改变结果顺序,union all 不,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15402899/

相关文章:

mysql - 在一条语句中执行两个(不相关)表的top5? (使用 "order by")

mysql 查询 orderby groupby,

mysql - 如何在 mysql UNION 查询中编写这个 GROUP BY

sql - TSQL 合并如何工作?针对 UPDATE 和 INSERT 的性能

sql-server - 如何在两列(由两个子查询生成)之间找到不同的元素?

sql-server - 如何在 SQL Server Management Studio 中备份连接

Mysql-根据顺序从另一列更新表列

ruby - 如何使用自定义对象从数组中删除重复项

mysql - MySql 中的表联合

sql - 比较 SQL 中以逗号分隔的字符串