子查询分页

分页的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'


测试结果如下

原文地址:https://www.cnblogs.com/jackylovewendy/p/4460405.html