Where子句中没有ORDER BY的SQL Row_Number()函数?

我用很好的解决scheme发现了一些关于这个主题的问题,但是如果数据不是以一种特定的方式sorting的话,他们实际上都没有处理如何处理。 例如,下面的查询:

WITH MyCte AS ( select employee_id, RowNum = row_number() OVER ( order by employee_id ) from V_EMPLOYEE ORDER BY Employee_ID ) SELECT employee_id FROM MyCte WHERE RowNum > 0 

如果数据是由employee_id来定购的,那么效果很好。 但是如果我的数据没有任何特定的顺序,但是行号本身就是一个ID呢? 我的目标是编写一个像这样的查询( Row_Number()函数没有ORDER BY子句):

 WITH MyCte AS ( select employee_id, RowNum = row_number() OVER ( <PRESERVE ORIGINAL ORDER FROM DB> ) from V_EMPLOYEE ORDER BY Employee_ID ) SELECT employee_id FROM MyCte WHERE RowNum > 0 

编辑:谷歌search,我觉得这不是真的可能。 可以build议一个解决方法吗?

以防万一它对别人有用。 我从其他地方弄明白了

 WITH MyCte AS ( select employee_id, RowNum = row_number() OVER (ORDER BY (SELECT 0)) from V_EMPLOYEE ORDER BY Employee_ID ) SELECT employee_id FROM MyCte WHERE RowNum > 0 

我用这个压制sorting:

 ORDER BY @@rowcount 

在查询中@@ rowcount是不变的。 例:

 select N = row_number() over (order by @@rowcount) from sys.columns 

使用(select0)在ORDER BY似乎运行速度慢得多。

你提出的方法真正的问题是,在数据库中的顺序不能保证。 它可能巧合的是始终以相同的顺序返回到您的应用程序,但SQL标准保证没有这样的顺序,并可能根据版本或版本变化而改变。 如果没有order by子句,则无法保证来自SQL Server的数据顺序。 这样的devise只是依靠“运气”。 如果这种可能的变化对你的实现有影响,那么你现在可能需要改变它,然后才能执行。

关于这个话题的好文章

原来的订单没有这样的东西。 如果不指定ORDER BY,SQL服务器不能保证行的顺序。 你可能会很幸运,并以特定的顺序得到结果,但可能随时改变。

有一个比上面更简单的解决scheme。 您仍然可以使用ROW_NUMBER,但在Order by子句中提供任意值:

 Select firstName, lastName, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) from tblPerson