Steven Xiao's blog

远行者需要智慧,更需要耐心! 工欲善其事,必先利其器。 授之鱼,不如授之渔。

博客园 首页 新随笔 联系 订阅 管理
  35 Posts :: 10 Stories :: 132 Comments :: 3 Trackbacks

--------------------------------------------------------------------------------

declare @PageIndex as int

declare @PageSize as int

set @PageIndex = 2 --当前的页面索引号
set @PageSize = 10  --每页要显示的记录数

SELECT *
FROM
( SELECT ROW_NUMBER() OVER (ORDER BY uid asc )AS Row,  UserName,TrueName,Email FROM wawa_user ) as tempTable
WHERE Row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize

--------------------------------------------------------------------------------

在sql 2005里增加了 ROW_NUMBER() 函数,作用是: 返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

它的使用方法为:

ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )

<partition_by_clause>

将 From 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序

 

 

 

posted on 2009-03-07 17:04 Steven Xiao 阅读(512) 评论(4) 编辑 收藏

Feedback

#1楼 2009-03-07 18:08 zmxmiss      
楼主的分页和
declare @PageIndex as int
declare @PageSize as int
set @PageIndex = 2 --当前的页面索引号
set @PageSize = 10 --每页要显示的记录数
select top @PageSize uid from table where uid not in (select @PageIndex*@PageSize uid from table )
比起来 那一个效率高些呢

 回复 引用 查看   

#2楼[楼主] 2009-03-07 21:07 Steven Xiao      
@zmxmiss
Exec( 'select top '+ @PageSize +' uid from table where uid not in (select top '+ @PageIndex*@PageSize +' uid from table order by uid ) order by uid ' ) 的效率要低,为什么呢?
因为select top N,执行的顺序是先按排序的条件查询出所有的记录,再取top N条记录



 回复 引用 查看   

单从语句上看,楼主的tempTable表实际上已经扫描了wawa_user表的所有数据,一楼语句把not in 转换成not exists的话效果会稍好些,因为not in会对表进行两次扫描。
如果是查前面几页,一楼的效果会好些,越查到后面就越慢,理论上是这样的

 回复 引用   

#4楼 2009-03-09 11:16 zmxmiss      
没办法 还是用的2000 没得ROW_NUMBER()这个函数
 回复 引用 查看