首页 > 开发 > 综合 > 正文

子查询分页

2024-07-21 02:47:16
字体:
来源:转载
供稿:网友
子查询分页

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

写成存储过程如下:

--存储过程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 INTEXEC dbo.P_GetPagedOrders1        @PageSize = 10,         @PageIndex = 1,        @RecordCount = @RecordCount OUTPUT,         @PageCount = @PageCount OUTPUTSELECT  @RecordCount AS N'@RecordCount' ,        @PageCount AS N'@PageCount'

测试结果如下


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表