我找到了很多关于这个主题的问题并提供了很好的解决方案,但是如果不以某种特定的方式对数据进行排序,那么它们实际上都没有解决该怎么做.例如,以下查询:
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)
编辑:通过谷歌搜索,我发现这是不可能的.有人可以建议一个解决方法吗?
在一些其他数据库(例如DB2或Oracle ROWNUM
)中,我可以省略ORDER BY
排名函数子句中的OVER()
子句.例如:
ROW_NUMBER() OVER()
Run Code Online (Sandbox Code Playgroud)
当与有序派生表一起使用时,这尤其有用,例如:
SELECT t.*, ROW_NUMBER() OVER()
FROM (
SELECT ...
ORDER BY
) t
Run Code Online (Sandbox Code Playgroud)
如何在SQL Server中进行模拟?我发现人们使用这个 技巧,但这是错误的,因为它对于派生表中的顺序会表现得非确定:
-- This order here ---------------------vvvvvvvv
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM (
SELECT TOP 100 PERCENT ...
-- vvvvv ----redefines this order here
ORDER BY
) t
Run Code Online (Sandbox Code Playgroud)
SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
SELECT TOP 100 PERCENT 1 UNION ALL …
Run Code Online (Sandbox Code Playgroud)