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 ...) 的功能