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)
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)似乎运行得慢得多.
您提出的方法的真正问题是无法保证数据库中的顺序.它可能巧合地一直以相同的顺序返回到您的应用程序,但SQL标准保证不会有这样的顺序,并且可能会根据版本或版本的更改而更改.如果没有order by子句,则无法保证来自SQL Server的数据顺序.这种设计只是依赖于"运气".如果这种可能的顺序变化对您的实现产生影响,您可能希望在进入实施过程之前立即更改它.
归档时间: |
|
查看次数: |
52532 次 |
最近记录: |