从数据表中取出20-30的记录

今天在看《程序员》杂志看到一道题目: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
Where rownum BETWEEN 1 AND 20  

备注
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 

 

 

posted on 2011-02-15 21:13  Jack.Wang  阅读(1223)  评论(0编辑  收藏  举报