UNION ALL是否保证结果集的顺序

我可以确定下面的脚本的结果集总是按照这个ORDERsorting吗?

SELECT 'O' UNION ALL SELECT 'R' UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'R' 

它可以被certificate有时是在一个不同的顺序?

没有固有的顺序,你必须使用ORDER BY 。 对于你的例子,你可以通过为每个SELECT添加一个SortOrder来轻松完成这个任务。 然后这将保持您想要的顺序的logging:

 SELECT 'O', 1 SortOrder UNION ALL SELECT 'R', 2 UNION ALL SELECT 'D', 3 UNION ALL SELECT 'E', 4 UNION ALL SELECT 'R', 5 ORDER BY SortOrder 

除非您专门通过查询提供订单,否则无法保证订单。

不,不是的。 SQL表本质上是无序的。 您需要使用order by来按照所需顺序获取内容。

问题不在于你尝试一次时是否工作。 问题是你是否可以信任这种行为。 而你不能。 SQL Server甚至不保证为此sorting:

 select * from (select t.* from t order by col1 ) t 

它在这里说:

当在视图,内联函数,派生表或子查询的定义中使用ORDER BY时,该子句仅用于确定TOP子句返回的行。 当查询这些结构时,ORDER BY子句不保证sorting结果,除非在查询本身也指定了ORDER BY。

SQL语言的基本原理是表格不是有序的。 因此,虽然您的查询可能在许多数据库中都有效,但您应该使用BlueFeetbuild议的版本来保证结果的顺序。

尝试删除所有的ALL ,例如。 甚至只有其中之一。 现在考虑一下,当SELECT查询是针对表的实际查询时,也可能发生在那里的优化types(以及其他许多types),并分别进行优化。 如果没有ORDER BY ,每个查询中的sorting将是任意的,并且您不能保证查询本身将以任何顺序处理。

说没有ORDER BY UNION ALL就好像在说“只要把所有的弹珠扔在地上”。 也许每次你把所有的弹珠扔在地上,最后都是由颜色来组织的。 这并不意味着下一次你把他们扔在地板上,他们会以同样的方式。 在SQL Server中sorting也是如此 – 如果您不说ORDER BY那么SQL Server会假定您不关心订单。 你可能会偶然看到某个顺序被返回,但是很多事情会影响一次select的顺序。 数据更改,统计信息更改,重新编译,计划刷新,升级,服务包,修补程序,跟踪标志…广告nauseum。

我会用大写字母来说明:

如果没有订单,您不能保证订单

进一步阅读:

http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior.aspx

另外, 请阅读Conor Cunningham的这篇文章,他是SQL团队中一个非常聪明的人 。

不,您可以通过SQL Server为您提供的logging获取logging。 您可以使用从1开始的索引对联合结果集应用sorting:

 SELECT 1, 'O' UNION ALL SELECT 2, 'R' UNION ALL SELECT 3, 'D' UNION ALL SELECT 4, 'E' UNION ALL SELECT 5, 'R' ORDER BY 1