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

SQL常用分页方法

表中主键必须为标识列,[ID] int IDENTITY (1,1)BSD爱好者乐园N)p7Z w&S/E J

6a3S0u [4s'@[#k7vK11.分页方案一:(利用Not In和SELECT TOP分页)
_b:t*y.Dd/SN4BeY1BSD爱好者乐园"vb7FR^`7JCJ
语句形式: 
-V9k G,Z F/N1SELECT TOP 页记录数量 *
"D-lk2Zz1FROM 表名
U q(JO:]J7H[8r1WHERE (ID NOT INBSD爱好者乐园-mf8f6Ms
  (SELECT TOP (每页行数*(页数-1)) ID
-_\5_;H?1  FROM 表名
(?&_sOy*a~~$w1  ORDER BY ID))BSD爱好者乐园rqXu{[2I$P-k
  ORDER BY ID
X FhG#JVQz`1//自己还可以加上一些查询条件BSD爱好者乐园9V)^^ve6@ ?*ka8q%f

"M0J.h QX/ZY1BSD爱好者乐园*}.yOr7j
例:
I;S ])BpN.V1select top 2 *
He G@'D9XYw1from Sys_Material_TypeBSD爱好者乐园 Zv2f6sHT0r
where (MT_ID not inBSD爱好者乐园S)Z4`s9S9r;p3H
    (select top (2*(3-1)) MT_ID from Sys_Material_Type  order by MT_ID))
7d:A1P-~R2R N J1order by MT_IDBSD爱好者乐园-k].V5x+g{(GO&\
BSD爱好者乐园6@M(s-B4A-e
BSD爱好者乐园{Fp Vu

L]Uh9O12.分页方案二:(利用ID大于多少和SELECT TOP分页)
k%s$rq`Bd9b-A1
\Y*\!^$jEbH&E0q.H1语句形式:BSD爱好者乐园`2Lj)r9r
SELECT TOP 每页记录数量 *
?&l;T#m;c2l4T1FROM 表名BSD爱好者乐园%_KL9{z aOm]"Y7|
WHERE (ID >
+U/LQ&o+Ip,zgHG1          (SELECT MAX(id)
^n\ [^6i/Vt T1    FROM (SELECT TOP 每页行数*页数 id  FROM 表BSD爱好者乐园 \!b8i,D Y1| EE`L
          ORDER BY id) AS T)
2r*fr%tD$c:F8j*g1      )
8C a"I {x1H V1ORDER BY IDBSD爱好者乐园\?if9A:P

a E4LYK(Du E.r.Z1例:BSD爱好者乐园lb"T;rXp
SELECT TOP 2 *
e](n6s7m8\)|$v2s1FROM Sys_Material_Type
9Ei1X-h`n9r@v1WHERE (MT_ID >
$H3q iXo1          (SELECT MAX(MT_ID)BSD爱好者乐园?;i*X?2J)\lu8js
          FROM (SELECT TOP (2*(3-1)) MT_ID
2UCU/L-jax7O1                FROM Sys_Material_TypeBSD爱好者乐园)R9Pn/qp;T({K9L
                ORDER BY MT_ID) AS T))
iq[D v,l1ORDER BY MT_IDBSD爱好者乐园%Q:r$V&`#f$S
BSD爱好者乐园2r-`wToAx v@ \

0\WGS+D1
A]g0k6ma,^"k#X13.分页方案三:(利用SQL的游标存储过程分页)
6ma#C(f2A)]7W6x1create  procedure SqlPagerBSD爱好者乐园x0y\ dzq:v
@sqlstr nvarchar(4000), --查询字符串
3Nn| G%s&h#O{1@currentpage int, --第N页
u\te vq/A1@pagesize int --每页行数BSD爱好者乐园4Y.\AiQc*krj5H&Y
as
M#mQH*fOP:H1set nocount on
U X*@*?@&G9[1declare @P1 int, --P1是游标的id
:XBC$@A0li'gcy1@rowcount int
FYjv T3D1exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount outputBSD爱好者乐园 u$[,y2PjV%d4I0X&{
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
Z2Z*p7m.~1set @currentpage=(@currentpage-1)*@pagesize+1
H*X8?"~&q'w o r0hw ?1exec sp_cursorfetch @P1,16,@currentpage,@pagesize
2M$K'Y!]q%jscXc1exec sp_cursorclose @P1
1`2h$}fV[le{5~1set nocount offBSD爱好者乐园gw8yo*a
BSD爱好者乐园q%c'V!BHAuI

5B!c7on,E3~E1
,h7vNB^w0a6?14.总结:
k E0L3rp$i T2[QH1其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
0N|3t*R$\d1建议优化的时候,加上主键和索引,查询效率会提高。BSD爱好者乐园 J"raDY/y'P:w

jH+F;sI"T4a{$?1通过SQL 查询分析器,显示比较:我的结论是:
2DLd;PO1分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句BSD爱好者乐园5}E S.g)so7f)_ir
分页方案一:(利用Not In和SELECT TOP分页)  效率次之,需要拼接SQL语句BSD爱好者乐园,n y^2v w4k_
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
[重要提醒]对本篇资料有疑问,请到论坛讨论,尽量使文章准确无误>>>
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: sql SQL 分页
 

评分:0

我来说两句

seccode