我可以确定以下脚本的结果集将始终按此ORDER进行排序吗?
SELECT 'O'
UNION ALL
SELECT 'R'
UNION ALL
SELECT 'D'
UNION ALL
SELECT 'E'
UNION ALL
SELECT 'R'
Run Code Online (Sandbox Code Playgroud)
可以证明有时候会有不同的顺序吗?
Tar*_*ryn 48
没有固有的顺序,你必须使用ORDER BY
.对于您的示例,您可以通过向SortOrder
每个SELECT 添加一个来轻松完成此操作.然后,这将按您想要的顺序保留记录:
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
Run Code Online (Sandbox Code Playgroud)
除非您通过查询专门提供订单,否则您无法保证订单.
Gor*_*off 37
不,不是的.SQL表本质上是无序的.您需要使用order by
以按所需顺序获取内容.
问题不在于你试用它是否有效.问题是您是否可以信任此行为.你不能.SQL Server甚至不保证这个的排序:
select *
from (select t.*
from t
order by col1
) t
Run Code Online (Sandbox Code Playgroud)
它在这里说:
在视图,内联函数,派生表或子查询的定义中使用ORDER BY时,该子句仅用于确定TOP子句返回的行.除非在查询本身中也指定了ORDER BY,否则在查询这些结构时,ORDER BY子句不保证有序结果.
SQL语言的一个基本原则是表没有排序.因此,尽管您的查询可能在许多数据库中有效,但您应该使用BlueFeet建议的版本来保证结果的排序.
Aar*_*and 16
ALL
例如,尝试删除所有s.或者甚至只是其中之一.现在考虑当SELECT
查询是针对表的实际查询并且单独优化时,那里必须发生的优化类型(以及许多其他类型)也是可能的.如果没有ORDER BY
,则每个查询中的排序将是任意的,并且您无法保证查询本身将以任何顺序处理.
说UNION ALL
没有ORDER BY
好像是说"就扔在地板上所有的大理石." 也许每当你把所有弹珠扔在地板上时,它们最终都是按颜色组织的.这并不意味着下次你将它们扔到地板上时它们的行为方式相同.对于SQL Server中的排序也是如此 - 如果您没有说,ORDER BY
则SQL Server假定您不关心订单.您可能会巧合地看到一直在返回某个订单,但很多事情都会影响下次选择的任意订单.数据更改,统计信息更改,重新编译,计划刷新,升级,Service Pack,修补程序,跟踪标记... ad nauseum.
我会用大写字母说清楚:
进一步阅读:
此外,请阅读Conor Cunningham的这篇文章,他是SQL团队中一个非常聪明的人.
不会.您以SQL Server为您提取的任何方式获取记录.您可以通过以下方式对基于1的索引的联合结果集应用订单:
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
Run Code Online (Sandbox Code Playgroud)