网络推荐

推荐给好友 上一篇 | 下一篇

SQL常用分页方法

表中主键必须为标识列,[ID] int IDENTITY (1,1)BSD爱好者乐园-GXn2l)eB!sbh
BSD爱好者乐园d:T.wQ~d8|d
1.分页方案一:(利用Not In和SELECT TOP分页)BSD爱好者乐园 kP b6AI
BSD爱好者乐园/`Mzt)lF$`A
语句形式: 
]oh)FmY:|]8YSELECT TOP 页记录数量 *BSD爱好者乐园h%}+L"ex T"EN+pI
FROM 表名BSD爱好者乐园zc sgG;oH)C3d
WHERE (ID NOT IN
x.N;RH#E[ pd  (SELECT TOP (每页行数*(页数-1)) IDBSD爱好者乐园;b0H r"@zO
  FROM 表名BSD爱好者乐园1gx\|6d/[-[ {({-P
  ORDER BY ID))BSD爱好者乐园9e-qy8h }"p
  ORDER BY ID
;?0ejHITcM//自己还可以加上一些查询条件BSD爱好者乐园I#Ai B*Qg v"^

V]^1owls1Vs m3sBSD爱好者乐园2R cP]U V
例:
!Ab M&uS.g5`dselect top 2 *BSD爱好者乐园BI)b `{]N%HGv\
from Sys_Material_Type
8k;Kw#TD\3]where (MT_ID not inBSD爱好者乐园0s/jo9V8vnQ)eO/H
    (select top (2*(3-1)) MT_ID from Sys_Material_Type  order by MT_ID))
O6C"Y3p5l3{1qp"Corder by MT_IDBSD爱好者乐园Io3mp$}4K-m*i

]_9s q L$Bj/zBSD爱好者乐园syVV!wH)Vo)`
BSD爱好者乐园p,l-K!Z8yi [
2.分页方案二:(利用ID大于多少和SELECT TOP分页)
S@$Z8o1}+tD Fz9ZP H
4J(k)Lh#L#T"PWQ语句形式:BSD爱好者乐园 ajp e!q5n-{vjt
SELECT TOP 每页记录数量 *BSD爱好者乐园 f+Rs eJ.CT
FROM 表名
U#^2C#^1O}X%H1^KTWHERE (ID >
$]E [nm!Kpy          (SELECT MAX(id)BSD爱好者乐园 ?4N n'\1?6c
    FROM (SELECT TOP 每页行数*页数 id  FROM 表BSD爱好者乐园q Ep:Y1zW&T!a
          ORDER BY id) AS T)BSD爱好者乐园-b}(a$RCO!C"| K5E
      )BSD爱好者乐园%y:p$E+LD:B
ORDER BY ID
PV2e0?S'T
1ac9Y%P9t+lV `例:
~(V+N!\ U NSELECT TOP 2 *BSD爱好者乐园j9Z\4\X{y
FROM Sys_Material_TypeBSD爱好者乐园?Y6I7B#G{Ko
WHERE (MT_ID >
_&{$KOQ4L~v          (SELECT MAX(MT_ID)BSD爱好者乐园 TZ2O(fbFw
          FROM (SELECT TOP (2*(3-1)) MT_ID
3Q z(z6i#o8^                FROM Sys_Material_Type
3V$T+D*UM P)wAu2M                ORDER BY MT_ID) AS T))BSD爱好者乐园S]8h8GkS
ORDER BY MT_ID
7f d*z6E3Aqy
:m[_Y;L't
&O \-S8^0Aoh8c
H!hhNFq5Bk$oG9x6D3.分页方案三:(利用SQL的游标存储过程分页)
#O `/n O3@X4Zncreate  procedure SqlPager
n.m'S(T {A3QLn,F@sqlstr nvarchar(4000), --查询字符串
Hp,z7E[oOV!]!B@currentpage int, --第N页
+F!|%IAr4q x7Wz/M@pagesize int --每页行数BSD爱好者乐园Amp!Wi }Y
asBSD爱好者乐园!T3p){/F^S:\ WH
set nocount onBSD爱好者乐园U:V$B2MSPdb&~jT
declare @P1 int, --P1是游标的id
&x7^V;KU,B.U6X)DX@rowcount int
v9h2U[lc$C`@exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
^o,r YMselect ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页BSD爱好者乐园G A&in j l I
set @currentpage=(@currentpage-1)*@pagesize+1
.q+I%eQa_5gexec sp_cursorfetch @P1,16,@currentpage,@pagesize
,c#Rf%I cUexec sp_cursorclose @P1BSD爱好者乐园:Be.|H9P1S
set nocount offBSD爱好者乐园!bu8LX JY/gH

]&krvM1}BSD爱好者乐园n"onpz+Yp$x
BSD爱好者乐园$w]:T5Z1a![
4.总结:
'Z]rgQr2e@其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。BSD爱好者乐园|/X*|ZO
建议优化的时候,加上主键和索引,查询效率会提高。BSD爱好者乐园 N2D ?#H[/JJAe

q xn*W/qyz?L J通过SQL 查询分析器,显示比较:我的结论是:BSD爱好者乐园x+Z;d^Ax+l
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
5_RT(IVLvP0H'{分页方案一:(利用Not In和SELECT TOP分页)  效率次之,需要拼接SQL语句
+m];F|8NB6N{A分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用因为使用范围的限制,BSD方面文章更新速度不快,站长会坚持每天更新博客,欢迎访问!
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: sql SQL 分页
 

评分:0

我来说两句

seccode