我需要将自动生成的自动增量 ID 添加到查询结果中。例如,对于查询
SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
而不是得到
- 101
- 100
- 99
我想得到
- 1, 101
- 2, 100
- 3, 99
我该怎么做?
我需要将自动生成的自动增量 ID 添加到查询结果中。例如,对于查询
SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
而不是得到
我想得到
我该怎么做?
如果是 SQL Server,最简单的方法是:
SELECT TOP 3
ROW_NUMBER() OVER(ORDER BY Users.Reputation DESC),
Users.Reputation
FROM Users
更新:
我检查了查询执行计划和内部顺序,它使用排序步骤定义了结果集的每个分区内行的逻辑顺序(在这种情况下我没有使用指定的分区条件),这是相同的按照正常排序:
SELECT Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
这一步之后有两个有趣的步骤:Segment和Sequence Project。第二个是告诉它是对有序数据集的计算。最后一步是 TOP 和 SELECT。
我对缺点很感兴趣,但似乎还可以。
最后只是一个注释:使用带有 TOP 的普通 OrderBy:
SELECT TOP 3 Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
排序更容易,但几乎相同:Sort (Top N sort)
怎么样:
;WITH CTE AS
(SELECT
RowNum = ROW_NUMBER() OVER(ORDER BY Reputation DESC),
Users.Reputation
FROM
Users
)
SELECT TOP 3
RowNum, Reputation
FROM
CTE
ORDER BY
RowNum
这是 SQL Server 2005及更高版本中可用的 CTE(通用表表达式),结合ROW_NUMBER()
排名功能,也可在 2005 和更高版本中使用。
它为下一条语句创建一个“即时”视图,并允许在选择之前先进行一些额外的处理。只是按照子句ROW_NUMBER()
中定义的顺序为每一行添加一个连续的数字。OVER (ORDER BY ....)
所以第一行得到#1,第二行得到#2,依此类推。
在此处阅读有关 CTE 的更多信息:MSDN - 使用公用表表达式
在此处阅读有关ROW_NUMBER
其他排名功能的更多信息:MSDN ROW_NUMBER