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。
我会用大写字母来说明:
如果没有订单,您不能保证订单
进一步阅读:
另外, 请阅读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