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

时间:2020-01-08 09:46:37

标签: mysql sql sql-order-by

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

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

如果订单没有变化(从我的角度测试,订单没有变化),这是否很好用?

3 个答案:

答案 0 :(得分:3)

如果没有显式的ORDER BY子句,则在不同的执行中,特定行可能会得到不同的ROW_NUMBER()。与ORDER BY (SELECT NULL)相同,后者可能是一种绕过语法要求的技巧,也可能是一种语法糖。它不执行命令。

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

答案 1 :(得分:1)

您已用问题MySQL标记。但是您使用了不必要的奥术语法。 MySQL支持这两种构造:

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

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

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

您的特定语法是SQL Server的一种解决方法,因为该数据库要求ORDER BY ROW_NUMBER()子句,并且 SQL Server不允许{{ 1}}。

当然,该数据库或任何其他数据库中的条件完全相同。

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

答案 2 :(得分:0)

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