ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 是不是保留订单?

Posted

技术标签:

【中文标题】ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 是不是保留订单?【英文标题】:Does ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) preserves the order?ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 是否保留订单? 【发布时间】:2020-01-08 09:46:37 【问题描述】:

我计划在没有任何适当数据列用于 order-by 子句的选择查询中使用 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))

一般来说,如果我将ORDER BY 与有效的列数据一起使用,那么每次执行时ROW_NUMBER() 的排序将完全相同。通过使用ORDER BY (SELECT NULL)ROW_NUMBER() 的顺序是什么,会随着每次执行而改变吗?

如果顺序没变(我这边测试,顺序没变),好用吗?

【问题讨论】:

您期望某个顺序似乎暗示实际上您心中的某个顺序。您可能希望将示例数据添加到您的问题中。不确定与ORDER BY (SELECT NULL) 的合同,但我猜你不应该依赖它。 我在数据方面没有订单。我使用 ROW_NUMBER() 函数通过使用行号顺序分批(一次 500 个)选择数据的唯一原因。 好吧,它要么使用某种顺序,要么不使用;但这些都不重要,因为在任何一种情况下,随着基础数据的变化,每组返回的前 N ​​条记录也会发生变化。 在我的情况下,每天整个表都替换为新数据,因为我不能使用 ORDER BY 并且想使用 ROW_NUMBER()OVER () 函数通过使用行号来批量选择记录。如果 ORDER BY (SELECT NULL) 每次执行都给出相同的顺序,所以我的代码可以选择数据而不必担心重复 mysql 8.0 中,ORDER BY 不是必需的。所以你可以做row_number() over ()row_number() over (order by (select null)) 是 MS Sql Server 的一种解决方法,它需要在 ROW_NUMBER 中使用非文字 ORDER BY 【参考方案1】:

如果没有明确的ORDER BY 子句,您可能会在不同的执行中为特定行获得不同的ROW_NUMBER()。与ORDER BY (SELECT NULL) 相同,它要么是绕过语法要求的hack,要么是语法糖;它不执行命令。

你得到了相同的结果,是的,但不能保证

【讨论】:

【参考方案2】:

您已标记问题 MySQL。但是您不必要地使用了晦涩难懂的语法。 MySQL 支持这两种结构:

ROW_NUMBER() OVER ()
ROW_NUMBER() OVER (ORDER BY NULL)

在这两种情况下,您都在说“我不在乎订单是什么”。 一个非常重要的推论:“我不在乎同一查询的两次不同运行的结果是否相同。

说实话,当ORDER BY 键相同时,ROW_NUMBER() 不能保证返回相同的结果。为什么?因为 SQL 表和结果集代表 无序 集。没有可依赖的“默认”顺序。

您的特定语法是 SQL Server 的一种解决方法,因为该数据库需要 ORDER BY 子句用于 ROW_NUMBER() 并且 SQL Server 不允许在 ORDER BY 中使用常量。 p>

当然,完全同样的条件也适用于该数据库——或任何其他数据库。

简单的答案是:不,如果再次运行相同的查询,您不能假设结果将是相同的顺序。

【讨论】:

【参考方案3】:

执行 ORDER BY (SELECT NULL) 总是返回与执行普通表相同的顺序。

【讨论】:

。 .这个答案是完全错误的。我建议你删除它。 嗨,Gordon,请告诉我删除它的原因,因为我在不同的表上实际测试过,结果与普通表的执行结果相同。 。 .您可以在运行的查询中观察这一点,但据我所知,Microsoft 不保证这一点。

以上是关于ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 是不是保留订单?的主要内容,如果未能解决你的问题,请参考以下文章

oracle的row_number() OVER (ORDER BY COL2 asc)和row_number() OVER (PARTITION BY COL1 ORDER BY COL2)的用法

分页查询的两种方法(双top 双order 和 row_number() over ())

去重 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN

LINQ to SQL 模拟实现 ROW_NUMBER() OVER(ORDER BY ...) 的功能

通过 row_number() 使用 over order 更新

row_number() over (partition by....order by...)用法 分组排序