【问题标题】: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

标签: mysql sql sql-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 不保证这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2016-11-17
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多