你的位置:首页 > 数据库

[数据库]子查询分页


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


测试结果如下