zoukankan      html  css  js  c++  java
  • sqlservler 分页的实现

    转载自:http://www.cnblogs.com/FreeDong/archive/2011/09/27/2193240.html

    当我们显示列表信息的时候,我们常常以分页形式显示,当然在ASP.NET中的ListView和GridView控件等都自带了分页功能,但是效 率很低,无法适用大量数据,并且灵活性不高。因而我们一般都使用第三方分页控件或者自己编写分页程序。那么在基于ADO.NET中实现自定义分页的第一步 也就是最关键一步必然是要写分页SQL语句,而且语句效率要高。当然本文的一个目的就是学习编写分页查询语句,另一个目的则是帮助初学者更深入了解 SELECT语句。

      那么本文的一个查询示例是查询第11-15条记录,即每页5条,查第3页包含的结果集。查询的视图名为LeaveWordView,该视图有个名为ID的整型自增主键字段。

      好了,我现在要引出的第一种写法呢是使用NOT IN关键字。

    --IN 和 NOT IN,效率较低
    --查询第11-15条记录,后面的语句即可替换为ADO.NET中执行Command的CommandText
    SELECT TOP 5 * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP 10 ID FROM LeaveWordView)
    --SELECT TOP PageSize * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP (PageIndex-1)*PageSize ID FROM LeaveWordView)

      这条语句的原理是先查询1-10条记录的ID,然后再查询ID不属于这1-10条记录的ID,并且只需要5条记录,因为每页大小就是5,这就是获取到的第11-15条记录,这是非常简单的一种写法。另外IN语句与NOT IN语句类似,这是NOT IN的写法,但是显然达不到我们的需求,因为效率太低。所以我们接着看第二种写法。

      第二种写法也是相当易于理解,通过若干次升序与降序实现。

    --通过升序与降序方式进行查询分页
    SELECT * FROM(
    SELECT TOP 5 * FROM(
    SELECT TOP 15 * FROM LeaveWordView ORDER BY ID ASC)
    AS TEMP1 ORDER BY ID DESC)
    AS TEMP2 ORDER BY ID ASC

      这条语句首先查询前15条记录,然后在倒序查询前5条记录(即倒数5条记录),这个时候就已经获取到了11-15条记录,但是他们的顺序是倒序,所以最后又进行升序排序。

      接下来看第三种写法,采用MAX(ID)函数。

    --MIN()函数和MAX()函数的使用
    --id > 第(PageIndex-1)*PageSize条记录的id AND id <= 第PageIndex*PageSize条记录的id
    SELECT TOP 5 * FROM LeaveWordView WHERE ID>
    (SELECT MAX(ID) FROM(SELECT TOP 10 ID FROM LeaveWordView ORDER BY ID) AS TEMP1) --(第10条的id)

      这个理解起来也简单,先把第十条记录的id找出来(当然这里面是直接使用MAX()进行查找,MIN()函数的用法也是类似的),然后再对比取比第十条记录的id大的前5条记录即为我们需要的结果。

      OK,我们了解完了上述三种分页查询语句后,我来看最后一种,也是我本人推荐使用的一种,使用ROW_NUMBER。我记得Oracle有个ROWID,使得我们的查询更方便,因为我们很多时候就比较郁闷于整型的ID字段不连续,导致了原本可以使用很简单很高效的一些SQL语句查询变成了较为复杂。而到SQL Server2005出来的时候,类似的功能实现了,那便是ROW_NUMBER,ROW_NUMBER后面必须跟着OVER(ORDER BY [FIELD]),我们来看具体的写法。

    --用行号(ROW_NUMBER)查询,比较高效的查询方式,只有在SQL Server2005或更高版本才支持
    --SELECT ROW_NUMBER() OVER(ORDER BY ID) AS ROWID FROM LeaveWordView
    SELECT * FROM(
    SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,*
    FROM LeaveWordView) AS TEMP1
    WHERE ROWID>10

      在这里面需要注意的是OVER的括号里面可以写多个排序字段,比如:OVER(ORDER BY CreatedTime,ID)。这条语句是查询前15条记录,然后取出ROWID=10以后的记录。

    以上是4中常用分页查询语句,其实他们的效率在万级别一下数据的时候,效率相差并不大,但是在处理上百万数据时,毫无疑问我们将选择最后一种方式。本文一个目的是探讨分页查询,另一个呢则是分享SELECT语句的一些写法。

    本人实现方法如下:

     public List<RegistInfo> queryListforPage(int beginIndex,int endIndex,int pageCount) {
            String sql = "SELECT id id,phone_number phoneNumber,regist_content content,regist_date registDate,regist_ok regiestOk,comments comments FROM (SELECT ROW_NUMBER() OVER(ORDER BY id ASC) AS ROWID,* FROM REGIST_INFO) AS TEMP1 WHERE ROWID between ? and ?";
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            RegistInfo register = null;
            List<RegistInfo> list = new ArrayList<RegistInfo>();
            conn = ConnectionManage.getConnection();
            try {
                ps = conn.prepareStatement(sql);
                ps.setInt(1, beginIndex);
                ps.setInt(2, endIndex);
                rs = ps.executeQuery();
                while(rs.next()){
                    register = new RegistInfo();
                    register.setComments(rs.getString("comments"));
                    register.setContent(rs.getString("content"));
                    register.setId(rs.getInt("id"));
                    register.setPhoneNumber(rs.getString("phoneNumber"));
                    register.setRegiestOk(rs.getInt("regiestOk"));
                    register.setRegistDate(rs.getDate("registDate"));
                    list.add(register);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                JDBCSQLUtils.release(conn, ps, rs);
            }
            return list;

  • 相关阅读:
    如何构建积木式Web应用
    ASP.NET 2.0 异步页面原理浅析 [1] [原]
    HybridDictionary 类
    datagrid自定义
    认识.NET的集合
    织梦 10060
    java.io.FileNotFoundException: E:\temp (拒绝访问。)
    引用与对象实例化
    C#中为DataGrid添加下拉列表框
    C#中使用指针
  • 原文地址:https://www.cnblogs.com/zrui-xyu/p/4829973.html
Copyright © 2011-2022 走看看