SQL Server分页方法汇总

作者:springsnow 时间:2024-01-26 20:18:49 

根据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的当前页面是从零开

来源:https://www.cnblogs.com/springsnow/p/9590661.html

标签:SQL,Server,分页
0
投稿

猜你喜欢

  • Python通用循环的构造方法实例分析

    2022-03-30 00:03:56
  • 简单了解Python3 bytes和str类型的区别和联系

    2023-11-19 21:52:29
  • Python虚拟机字节码教程之控制流实现详解

    2023-01-09 09:56:53
  • python根据京东商品url获取产品价格

    2022-01-26 12:14:31
  • 使用Python脚本生成随机IP的简单方法

    2023-12-30 06:46:28
  • python模块之subprocess模块级方法的使用

    2022-05-10 03:28:32
  • Python基础知识学习之类的继承

    2022-09-02 15:41:05
  • 通过Python把学姐照片做成拼图游戏

    2022-03-24 17:21:01
  • django的登录注册系统的示例代码

    2021-05-14 23:27:59
  • 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法

    2024-01-29 09:15:46
  • php基础教程

    2024-06-05 09:23:33
  • python3连接mysql获取ansible动态inventory脚本

    2024-01-19 23:13:54
  • JS+CSS实现闪烁字体效果代码

    2024-04-18 09:31:04
  • 解决golang内存溢出的方法

    2024-05-21 10:20:12
  • windows下安装make及使用makefile文件

    2023-05-08 07:50:53
  • 使用sqlplus连接Oracle数据库问题

    2024-01-13 09:25:16
  • python matplotlib中文显示参数设置解析

    2022-11-18 14:11:41
  • python3 写一个WAV音频文件播放器的代码

    2023-04-09 05:06:36
  • Python3 log10()函数简单用法

    2021-06-27 16:47:16
  • asp连接mysql的问题(端口)

    2009-08-21 13:23:00
  • asp之家 网络编程 m.aspxhome.com