我计划在没有任何要在order-by子句中使用任何适当数据列的选择查询中使用ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
。
通常,如果我将ROW_NUMBER()
与有效的列数据一起使用,则每次执行时ORDER BY
的顺序将完全相同。通过使用ORDER BY (SELECT NULL)
,ROW_NUMBER()
的顺序是什么,每次执行都会改变吗?
如果订单没有变化(从我的角度测试,订单没有变化),这是否很好用?
答案 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)总是返回与执行普通表相同的顺序。