zoukankan      html  css  js  c++  java
  • 子查询分页

    分页的sql脚本是2013年大实训的时候老师讲的,今天把它整理出来。

    数据库就用Northwind数据库。就用Orders表为例子吧,假设每页都显示10条记录。

    先从简单的脚本开始吧。先取到第一页的数据。

    SELECT TOP 10 * FROM dbo.Orders

    第二页的数据

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 10 OrderID FROM dbo.Orders)

    第三页的数据

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 20 OrderID FROM dbo.Orders)

     由此可以推断出,第N页的数据为

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP (N-1)*10 OrderID FROM dbo.Orders)

    写成通用的SQL语句如下:

    BEGIN
        DECLARE @PageSize INT   --每页显示条数
        DECLARE @PageIndex INT    --页码(从1开始)
        SET @PageSize = 10
        SET @PageIndex = 4
        SELECT TOP ( @PageSize )
                *
        FROM    dbo.Orders
        WHERE   OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize )
                                        OrderID
                                 FROM   dbo.Orders
                                 ORDER BY OrderID ASC )
        ORDER BY OrderID ASC
    END

    写成存储过程如下:

    --存储过程
    CREATE PROCEDURE P_GetPagedOrders1
        @PageSize INT ,             --每页显示条数
        @PageIndex INT ,            --页码(从1开始)
        @RecordCount INT OUTPUT ,    --数据总数
        @PageCount INT OUTPUT        --总页数
    AS
        BEGIN
            --获取数据总数
            SELECT  @RecordCount = COUNT(1)
            FROM    dbo.Orders
            --计算总页数
            SET @PageCount = @RecordCount / @PageSize
            IF @RecordCount % @PageSize > 0
                BEGIN
                    SET @PageCount = @PageCount + 1
                END
            --获取当前页的数据
            SELECT TOP ( @PageSize )
                    *
            FROM    dbo.Orders
            WHERE   OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize )
                                            OrderID
                                     FROM   dbo.Orders
                                     ORDER BY OrderID ASC )
            ORDER BY OrderID ASC
        END

    测试存储过程

    DECLARE @RecordCount INT ,
            @PageCount INT
    
    EXEC dbo.P_GetPagedOrders1
            @PageSize = 10, 
            @PageIndex = 1,
            @RecordCount = @RecordCount OUTPUT, 
            @PageCount = @PageCount OUTPUT
    
    SELECT  @RecordCount AS N'@RecordCount' ,
            @PageCount AS N'@PageCount'


    测试结果如下

  • 相关阅读:
    super.getClass().getName()方法调用的返回
    外观模式(Façade Pattern)
    Framework 4.0 将何去何从
    SQL Server 2005 第一篇 引言
    抽象工厂模式(Abstract Factory)
    浅谈分页技术
    垃圾邮件
    读书时的软件开发梦
    写技术博客的一个原因应该是寂寞吧
    当下10大最热门的网站开发技术
  • 原文地址:https://www.cnblogs.com/jackylovewendy/p/4460405.html
Copyright © 2011-2022 走看看