子查询分页

it2022-05-08  11

分页的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/dan-jacky/p/4460405.html

相关资源:数据结构—成绩单生成器

最新回复(0)