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

Leg*_*end 42 sql database sql-server

我找到了很多关于这个主题的问题并提供了很好的解决方案,但是如果不以某种特定的方式对数据进行排序,那么它们实际上都没有解决该怎么做.例如,以下查询:

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
Run Code Online (Sandbox Code Playgroud)

如果要通过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
Run Code Online (Sandbox Code Playgroud)

编辑:通过谷歌搜索,我发现这是不可能的.有人可以建议一个解决方法吗?

Leg*_*end 93

以防它对其他人有用.我只是从其他地方弄明白了:

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
Run Code Online (Sandbox Code Playgroud)

  • ORDER BY(SELECT 0)不保证正确的排序.请参阅http://stackoverflow.com/questions/9737131/sql-server-join-in-order (8认同)

kab*_*rka 22

我用它来抑制排序:

ORDER BY @@rowcount
Run Code Online (Sandbox Code Playgroud)

@@ rowcount在查询中是常量.例:

select N = row_number() over (order by @@rowcount) from sys.columns
Run Code Online (Sandbox Code Playgroud)

在ORDER BY中使用(选择0)似乎运行得慢得多.


dou*_*g_w 6

您提出的方法的真正问题是无法保证数据库中的顺序.它可能巧合地一直以相同的顺序返回到您的应用程序,但SQL标准保证不会有这样的顺序,并且可能会根据版本或版本的更改而更改.如果没有order by子句,则无法保证来自SQL Server的数据顺序.这种设计只是依赖于"运气".如果这种可能的顺序变化对您的实现产生影响,您可能希望在进入实施过程之前立即更改它.

关于这个主题的好文章