根据SalesOrderID排序,取第16-18行这3条记录。
方法一:(最常用的分页代码, top / not in)
1
2
3
4
5
6
|
SELECT TOP 3 [SalesOrderID], [RevisionNumber], [OrderDate] FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] WHERE [SalesOrderID] NOT IN ( SELECT TOP 15 [SalesOrderID] FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] ORDER BY [SalesOrderID] ) ORDER BY SalesOrderID; |
备注: 注意前后的order by 一致
方法二:排名开窗函数 (row_number() over (order by ))
1
2
3
4
5
6
|
SELECT [SalesOrderID], [RevisionNumber], [OrderDate] FROM ( SELECT [SalesOrderID], [RevisionNumber], [OrderDate] , ROW_NUMBER() OVER ( ORDER BY SalesOrderID ) AS rowid FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] ) cte WHERE rowid BETWEEN 16 AND 18; |
方法三:(offset /fetch next, SQL Server 2012支持,性能最好!)
1
2
3
|
SELECT [SalesOrderID], [RevisionNumber], [OrderDate] FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] ORDER BY SalesOrderID OFFSET 15 ROW FETCH NEXT 3 ROWS ONLY ; |
总结:利用变量进行分页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
DECLARE @page INT , @ size INT , @Total INT ; SELECT @page = 3, @ size = 10; --当前页面为3,页面大小为10 -------方法一 SELECT TOP ( @ size ) [SalesOrderID], [RevisionNumber], [OrderDate] FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] WHERE [SalesOrderID] NOT IN ( SELECT TOP (( @page - 1 ) * @ size ) [SalesOrderID] FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] ORDER BY [SalesOrderID] ) ORDER BY SalesOrderID; -------方法二 SELECT [SalesOrderID], [RevisionNumber], [OrderDate] FROM ( SELECT [SalesOrderID], [RevisionNumber], [OrderDate] , ROW_NUMBER() OVER ( ORDER BY SalesOrderID ) AS rowid FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] ) cte WHERE rowid BETWEEN ( @page - 1 ) * @ size + 1 AND @page * @ size ; -------方法三 SELECT [SalesOrderID], [RevisionNumber], [OrderDate] FROM [AdventureWorks2012].[Sales].[SalesOrderHeader] ORDER BY SalesOrderID OFFSET ( @page - 1 ) * @ size ROWS FETCH NEXT @ size ROWS ONLY ; ---offset的当前页面是从零开 |
到此这篇关于SQL Server分页的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/springsnow/p/9590661.html