在其他一些数据库中(例如DB2或Oracle) ROWNUM
),我可以省略 ORDER BY
排名函数中的子句 OVER()
条款。例如:
ROW_NUMBER() OVER()
当与有序派生表一起使用时,这尤其有用,例如:
SELECT t.*, ROW_NUMBER() OVER()
FROM (
SELECT ...
ORDER BY
) t
如何在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
一个具体的例子(可以看到 SQLFiddle):
SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
SELECT TOP 100 PERCENT 1 UNION ALL
SELECT TOP 100 PERCENT 2 UNION ALL
SELECT TOP 100 PERCENT 3 UNION ALL
SELECT TOP 100 PERCENT 4
-- This descending order is not maintained in the outer query
ORDER BY 1 DESC
) t(v)
此外,我不能重用派生表中的任何表达式来重现 ORDER BY
在我的情况下,因为派生表可能不可用,因为它可能由某些外部逻辑提供。
那我该怎么办呢?我可以这样做吗?