找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4939|回复: 0

[SQL SERVER] 最优化的ms sql server分页sql语句

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-7-1 17:49:05 | 显示全部楼层 |阅读模式

最优化的ms sql server分页sql语句

特点:一次查询,数据库只返回一页的数据。而不是取出所有的数据。

说明:

pagesize
每页显示记录数

cureentpage:当前页数

select * from (   select TOP pagesize * FROM ( SELECT TOP pagesize*cureentpage   * from user_table   ORDER BY id ASC ) as aSysTable   ORDER BY id DESC ) as bSysTable   ORDER BY id ASC

例子说明:

假如数据库表如下:

user_table:

id:主键,自增

username:字符

password:字符

假设有80条记录,每页显示10条记录,id 180

现在按照id升序排列取出第三页的数据应该为:所取得记录的id 应该为 2130

这时该语句应该为:

select * from (   select TOP 10 * FROM ( SELECT TOP 30   * from user_table   ORDER BY id ASC ) as aSysTable   ORDER BY id DESC ) as bSysTable   ORDER BY id ASC

原理如下:

先按照id从小到大升序取出30条记录(3*10,也就是:id 1-30 之间的记录
SELECT TOP 30   * from user_table   ORDER BY id ASC

然后按照ID降序排列这30条记录,得到记录为id 在:从30 1  

然后在这些30条记录中取出前10条记录:取得的记录为:id 30-21之间。这就是我们需要的数据,但这时是按照降序排列的,不符合要求。

最后在重新排序得到最终我们需要的数据。id21-30之间。

希望对大家有所帮助。



  1. //试上面的没用.下边的好使.
  2. Jsp如下:
  3. **********************
  4. <%@ page language="java" import="java.util.*,java.sql.*" %>
  5. <%@ page contentType="text/html;charset=gb2312"%>
  6. <jsp:useBean id="cn" scope="page" class="myConnection.Conn" /><!--引用数据库操作的bean,自己完成,这里不再赘述-->
  7. <%
  8. int curpage=1;//当前页
  9. int page_record=20;//每页显示的记录数
  10. //用下面的方法(sql查询完成,速度快)
  11. curpage=Integer.parseInt(request.getParameter("page"));//获取传递的值,需要显示的页
  12. ResultSet rs=cn.rsexecuteQuery("select top "+page_record+" * from tablename where id not in (select top "+(curpage*page_record)+" id from tablename order by id desc) order by id desc");
  13. //本查询语句得到的是所要显示的1000页的20条记录,大致思路为——子查询排除需要显示的记录前的所有记录,父查询则对余下的记录进行降序排列
  14. while(rs.next) {
  15. out.println(rs.getInt("id").toString());
  16. }
  17. rs.close();
  18. %>
复制代码

SELECT * from
(SELECT TOP 10 * FROM
(SELECT TOP 30 * from qbjd ORDER BY id ASC) as aSysTable ORDER BY id DESC) as bSysTable ORDER BY id ASC

【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表