加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server中分页的实现方法有几种,分别是什么

发布时间:2023-05-05 14:02:25 所属栏目:MsSql教程 来源:
导读:很多朋友都对“SQL Server中分页的实现方式有几种,分别是什么”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧
很多朋友都对“SQL Server中分页的实现方式有几种,分别是什么”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧!
 
根据SalesOrderID排序,取第16-18行这3条记录。
 
方法一:(最常用的分页代码, top / not in)
 
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 ))
 
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支持,性能最好!)
 
SELECT   [SalesOrderID], [RevisionNumber], [OrderDate]
 
 FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
 
 ORDER BY SalesOrderID OFFSET 15 ROW FETCH NEXT 3 ROWS ONLY;
 
总结:利用变量进行分页
 
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的当前页面是从零开
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章