SQL Server UNION – 什么是默认的ORDER BY行为

如果我有几个联合声明作为一个人为的例子:

SELECT * FROM xxx WHERE z = 1 UNION SELECT * FROM xxx WHERE z = 2 UNION SELECT * FROM xxx WHERE z = 3 

行为的默认order by什么?

我看到的testing数据本质上不会按照上面指定的顺序返回数据。 即数据是有序的,但我想知道这是什么优先规则。

另一件事是在这种情况下,xxx是一个视图。 该视图将3个不同的表连在一起,以返回我想要的结果。

没有默认的顺序。

没有Order By子句,返回的顺序是不确定的。 这意味着SQL Server可以按照喜欢的顺序将它们带回来。

编辑:根据我所看到的,没有一个Order By,结果返回的顺序取决于查询计划。 所以如果有一个索引正在使用,结果可能会按照这个顺序返回,但是又不能保证。

关于添加ORDER BY子句:

这大概是这里最基本的,但我想我补充一点。 有时你不希望混合的结果,所以你想第一个查询的结果,然后第二个等等。 要做到这一点,我只是添加一个虚拟的第一列,并按顺序。 由于在工会中忘记列别名可能存在的问题,我通常按顺序by子句使用序号,而不是列名。

例如:

 SELECT 1, * FROM xxx WHERE z = 'abc' UNION ALL SELECT 2, * FROM xxx WHERE z = 'def' UNION ALL SELECT 3, * FROM xxx WHERE z = 'ghi' ORDER BY 1 

当我要运行两个查询时,虚拟序号列也是有用的,我知道只有一个将返回任何结果。 然后我可以检查返回结果的序号。 这使我不必做多个数据库调用和大多数空的结果集检查。

刚刚find了实际的答案。

因为UNION删除重复它做一个DISTINCT分类。 这是在所有UNION语句连接之前完成的(检查执行计划)。

要停止sorting,请执行UNION ALL,这也不会删除重复项。

如果你关心logging返回的顺序,你必须使用一个命令。

如果将其忽略掉,它可能会显示为有组织的(基于查询计划select的索引),但是您今天看到的结果可能不是您期望的结果,甚至可能会在明天运行相同的查询时更改结果。

编辑:一些好的,具体的例子:(所有的例子是MS SQL服务器)

  • Dave Pinal的博客描述了两个非常相似的查询如何显示不同的顺序,因为使用了不同的索引:

     SELECT ContactID FROM Person.Contact SELECT * FROM Person.Contact 
  • Conor Cunningham显示了当表变大时(如果查询优化器决定使用并行执行计划),表面顺序可以如何改变。

  • 雨果·科内利斯(Hugo Kornelis)certificate表面顺序总是基于主键。 这是他的后续解释。

遇到编写不好的代码是很常见的,它假定表格数据是按照插入顺序返回的,95%的时间编码器不知道这个问题,因为在许多常见的数据库(MSSQL,Oracle, MySQL的)。 这当然是一个完全的谬误,应该在遇到问题时总是纠正,而且总是自己使用Order By子句。

关于结果集sorting,UNION可能是欺骗性的,因为数据库有时会使用sorting方法来提供UNION中隐含的DISTINCT,这使得它看起来像行是故意sorting的 – 这不适用于UNION ALL当然没有明显的区别。

但是有一些隐式独立的algorithm,比如10g +中的Oracle哈希方法,没有sorting的应用。

正如DJ所说,总是使用ORDER BY

从我的实际经验,你可以通过使用“联盟”对“联盟所有”…即如果您的查询是像更改顺序

 Select Count(*) from Table A UNION Select Count(*) from Table B result is 10 26 

您可以通过将“UNION”replace为“UNION ALL”来翻转订单…然后结果将会是

 26 10