今天在看《程序员》杂志看到一道题目:SQL的一张表中有个自增的ID字段,但是现在不连续,写一条SQL语句取出某个位置到某个位置之间的数据。
这题目很简单,但是当时第一个想到的是用top + not in的方式去取出数据,后来想想都是SQL2005的时代了,之间在写一些分页的时候,也用过
数据库分页的方式,但是一时又想不起来于是查了一个msdn,原来是ROW_NUMBER ( ) ,语法如下:
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
SQL语句:
Select * From (Select (ROW_NUMBER() OVER(ORDER BY ID asc)) AS rownum,* From [TABLENAME]) t
备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数
<partition_by_clause>:将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序
返回类型:bigint
例子,假设有张tbusers表,有UserID 与UserName,我们取出第20条~30条的记录
1)top方式
select top 10 UserName from tbUsers where UserID not in(select top 20 UserID from tbUsers)
2) ROW_NUMBER ()方式
select UserID, UserName,row_num from
(
select *, row_number() over (order by UserID) as row_num from tbUsers
) t
where row_num between 21 and 30