我需要在查询结果中添加自动生成的自动增量ID。 例如,对于查询
SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
而不是
我想要
我该怎么做?
答案 0 :(得分:6)
最简单的方法,如果是SQL Server,那么这个:
SELECT TOP 3
ROW_NUMBER() OVER(ORDER BY Users.Reputation DESC),
Users.Reputation
FROM Users
更新
我检查了查询执行计划,以及内部顺序,它定义了结果集的每个分区中的行的逻辑顺序(在这种情况下我没有使用指定的分区条件),使用Sort步骤,与正常排序相同:
SELECT Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
在此步骤之后,有两个有趣的步骤:Segment和Sequence Project。第二个是告诉它是对有序数据集的计算。 最后的步骤是TOP和SELECT。
我对这些缺点很感兴趣,但似乎没问题。
最后只是一个注释:正常的OrderBy与TOP:
SELECT TOP 3 Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
排序更容易,但几乎相同:排序(前N种排序)
答案 1 :(得分:5)
怎么样:
;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 - Using Common Table Expressions
在此处详细了解ROW_NUMBER
和其他排名功能:MSDN ROW_NUMBER