我知道 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/