SELECT ROW_NUMBER() 是否保证返回按生成的行号排序的结果?

red*_*alx 12 order-by sql-server-2008-r2

例如考虑 SQL 查询:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
   [FooTable] AS A
Run Code Online (Sandbox Code Playgroud)

在这里,我观察到按 A.[Name] 排序的返回结果。如果我将 ROW_NUMBER 函数中定义的排序列更改为另一列,那么结果将再次按该列排序。

我希望将行号分配给行,但我不希望这些行按照相同的标准进行排序。这仅仅是查询执行方式的副作用(在我的情况下是在 SQL Server 2008 R2 上)还是这种行为是否有保证?(我找不到这样的保证的参考)。

Rem*_*anu 23

绝对不。证明:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC),
   ROW_NUMBER() OVER(ORDER BY A.[Name] DESC)
FROM
   [FooTable] AS A
Run Code Online (Sandbox Code Playgroud)

在 SQL 中保证顺序的唯一方法是请求它, ORDER BY在结果本身上使用。

  • **在 SQL 中保证订单的唯一方法是要求它** (22认同)

Aar*_*and 15

如果你问了这个问题,我想你实际上是想问:

如何在ROW_NUMBER()不重复复杂ORDER BY表达式的情况下进行排序?

我们可以告诉您为ROW_NUMBER()表达式创建一个别名,然后使用别名进行排序:

SELECT
   A.[Name],
   rn = ROW_NUMBER() OVER (ORDER BY <complex expression>)
FROM
   dbo.[FooTable] AS A
ORDER BY rn;
Run Code Online (Sandbox Code Playgroud)

现在您只需在一处更改表达式,结果排序将基于该表达式而无需重复。

  • 事实上,`重复复杂的 ORDER BY 表达式` 甚至不能保证输出会按 ROW_NUMBER() 顺序输出。除非 ORDER BY 子句中的列形成唯一键。 (6认同)