添加自动生成的ID以在结果中记录

时间:2012-08-25 15:47:36

标签: sql sql-server

我需要在查询结果中添加自动生成的自动增量ID。 例如,对于查询

SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC

而不是

  • 101
  • 100
  • 99

我想要

  • 1,101
  • 2,100
  • 3,99

我该怎么做?

2 个答案:

答案 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