2012-06-21 26 views
1

假设我有一个表项(ID INT主键,号码INT),具有记录确实ORDER BY的结果总是一样的(SQL Server 2005,2008)?

Id Number 
100  3 
200  3 

现在我在我的机器的结果集运行查询

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN 
FROM Item I 

Id RN 
100 1 
200 2 

现在我的问题是这个结果集是在所有机器上,还是在某些机器上它可能会改变为

Id RN 
200 1 
100 2 

欢迎任何帮助

+0

欢迎来到StackOverflow:如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”)格式和语法突出显示它!这样做,您不再需要任何' '和'
'标签! –

回答

2

除了由帕纳约蒂斯

提到结果的未确定的订单的ROW_NUMBER结果是关系的事件undeterministic。您需要在ORDER BY中添加一个唯一列的联系断路器,以便Number=3的两行具有应用的确定性编号。

假设Id是独特下面将确定性

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number,I.Id) RN 
FROM Item I 
ORDER BY RN 
1

你不指定任何次序对最终结果,所以你不会对结果怎么会出现任何保证。

要通过行号(RN)命令你应该添加一个ORDER BY子句RN:

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN 
FROM Item I 
ORDER BY RN 

的服务器,除非你要求它没有订购任何特定方式的结果。这意味着结果将按服务器处理的顺序显示。

服务器为每个查询创建执行计划,可以对数据进行排序以加快处理速度并使用不同的连接技术,这些技术也可能会影响排序。执行计划的形式取决于索引的存在和相关表的统计。最后,服务器可以使用并行执行计划,在这种情况下,最终将合并来自不同核心的部分结果集。

您可能永远也不会注意到这一点,但是对于同一台服务器,结果顺序可能会发生变化,因为数据和统计信息会随着时间而改变,从而导致不同的执行计划。

+0

而且它与SQL服务器版本没有任何关系,就像40年左右的SQL规范中那样。 SQL是基于SET的,集合没有内在顺序。 – TomTom

0

结果集可以是任何的:

Id  RN 
100  1 
200  2 

,或者

Id  RN 
200  1 
100  2 

,或者

Id  RN 
100  2 
200  1 

,或者

Id  RN 
200  2 
100  1 

SQL的规则很简单 - 如果你想一个特定顺序,你要问它。如果未完成指定了一个排序,那么系统可以自由地按照它找到的最方便的顺序排列行,只要它符合您给定的具有的规格即可。

如果要强制执行特定顺序,请完全指定它。例如。如果您始终需要第一个结果,请指定ORDER BY I.Number,I.Id,并且在ROW_NUMBER规范和ORDER BY子句中都有。