65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL 查询中的行号(Microsoft SQL Server 2000 和 2005)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (10投票s)

2009 年 8 月 17 日

CPOL

2分钟阅读

viewsIcon

156642

有助于在 SQL 查询的返回结果中分配行号。

引言

有时我们需要为 SQL 查询返回的结果集分配行号。由于 Microsoft SQL Server 2000 不支持行号函数,因此必须通过在 `select` 语句中使用 `into` 子句时引入 `IDENTITY` 列来实现。可以先填充临时表,然后使用临时表来获取包含行号字段的行。

Using the Code

以下示例演示了使用临时表为 `select` 查询结果分配行号的方法。请记住在 `select` 语句后删除临时表;否则,下次执行此查询时,它将抛出错误,指示临时表已存在。

SELECT IDENTITY(int, 1,1) AS RowNumber, EmployeeId INTO #temp _
	FROM EmployeeMaster ORDER BY EmployeeId ASC
SELECT * FROM #Temp ORDER BY RowNumber DROP TABLE #Temp 

`IDENTITY` 获取三个必需的参数,即身份列的数据类型、起始值和增量。通过这些参数,您可以根据需要自定义新列。例如,可以指定从 100 开始,每行递增 2 的整数列,如下所示:

IDENTITY(int,100,2)

这当然可以使用 Microsoft SQL Server 2005 完成。但是,SQL Server 引入了一个名为 `row_number()` 的新函数。此函数为记录数分配从 1 开始的唯一行号。

以下语句是上述查询集的 SQL Server 2005 等效语句:

 SELECT row_number() OVER (ORDER BY EmployeeId) AS RowNumber,  _
	EmployeeID FROM EmployeeMaster 

此语句不使用临时表。因此,获取速度将比以前的方法更快。与以前的方法一样,如果想从 100 开始行号,可以使用:

row_number() OVER (ORDER BY EmployeeId)+100 as RowNumber

除了 `row_number()` 函数之外,SQL Server 2005 还引入了 `rank()` 函数。这可用于根据另一列对记录进行排名。`rank` 函数的用法示例如下:

SELECT rank() OVER (ORDER BY JoinDate) AS RowNumber, _
	EmployeeID, JoinDate FROM EmployeeMaster

上述语句根据每个员工的入职日期获取排名,并将其作为新列。如果该列是键列(例如 `EmployeeId`),则 `row_number()` 和 `rank()` 都将产生相同的结果。

历史

  • 2009 年 8 月 17 日:初始发布 
© . All rights reserved.