ROW_NUMBER() OVER (ORDER BY (SELECT NULL))是否保留顺序?

5

我打算在没有任何合适数据列用于order-by子句的查询中使用 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))

通常情况下,如果我使用有效列数据的 ORDER BYROW_NUMBER() 的排序将会完全相同。但是,如果使用 ORDER BY (SELECT NULL)ROW_NUMBER() 的排序方式会发生什么变化?每次执行时是否都会改变排序方式?

如果排序不会改变(从我的测试结果来看,排序不会改变),这样做是可行的吗?


你期望某种顺序似乎意味着实际上你有某种特定的顺序在脑海中。你可能想在你的问题中添加样例数据。虽然我不确定ORDER BY (SELECT NULL)的约定,但我猜测你不应该依赖它。 - Tim Biegeleisen
我的数据没有顺序。我使用ROW_NUMBER()函数按行号顺序挑选数据,每次挑选500个数据。 - veeru
无论它使用什么顺序,或者不使用任何顺序,都没有关系。因为在任何情况下,随着基础数据的更改,每个组返回的前N条记录也会发生变化。 - Tim Biegeleisen
在我的情况下,每天整个表都会被新数据替换,而且由于我不能使用ORDER BY,想要使用ROW_NUMBER() OVER()函数通过行号分批选择记录。如果ORDER BY (SELECT NULL)每次执行都给出相同的顺序,那么我的代码就可以在不担心重复的情况下选择数据。 - veeru
1
在MySql 8.0中,不需要使用ORDER BY。因此,您可以使用row_number() over ()row_number() over (order by (select null))是MS Sql Server的解决方法,它要求在ROW_NUMBER中使用非文字的ORDER BY - LukStorms
3个回答

6

如果没有显式的ORDER BY子句,可能会在不同的执行中得到特定行的不同ROW_NUMBER()。使用ORDER BY (SELECT NULL)也是一种绕过语法要求的黑科技或者语法糖,它并不能强制排序。

你现在得到了相同的结果,但是并没有保证


4
你在提问时使用了MySQL标签,但你使用了不必要的复杂语法。MySQL支持以下两种结构:
ROW_NUMBER() OVER ()
ROW_NUMBER() OVER (ORDER BY NULL)

在这两种情况下,您都在说“我不关心顺序”。一个非常重要的推论是:“我不关心同一查询在两次不同运行中的结果是否相同”。
老实说,当ORDER BY键相同时,ROW_NUMBER()不能保证返回相同的结果。为什么呢?因为SQL表和结果集表示无序集合。没有“默认”排序可以借鉴。
你特定的语法是SQL Server的解决方法,因为该数据库要求ROW_NUMBER()有ORDER BY子句,并且SQL Server不允许在ORDER BY中使用常量。
当然,在那个数据库或任何其他数据库中,情况完全相同。
简单的答案是:不,您不能假设如果再次运行相同的查询,结果将按照相同的顺序返回。

-1

使用ORDER BY (SELECT NULL)进行排序的执行结果与对普通表进行排序的执行结果相同。


1
这个回答是完全错误的。我建议你直接删除它。 - Gordon Linoff
嗨戈登, 请告诉我删除它的原因,因为我在不同的表格上进行了实际测试,结果与常规表格的执行相同。 - MOHIT AGARWAL
您可以在运行的查询中观察到这一点,但据我所知,微软并不保证这一点。 - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接