博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL分页查询的几种方式
阅读量:6539 次
发布时间:2019-06-24

本文共 2011 字,大约阅读时间需要 6 分钟。

https://www.cnblogs.com/lxhbky/p/5962393.html

 

需求:查询表dbo.Message,每页10条,查询第2页

1:TOP()

SELECT TOP(20) * FROM  dbo.Message WHERE Code NOT IN (SELECT TOP(10) Code FROM dbo.Message)

2:BETWEEN *  AND *  ,  Row_Number() OVER(ORDER BY *) AS rowNum 

SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM dbo.Message SELECT * FROM #a WHERE rowNum BETWEEN 11 AND 20 DROP TABLE #a;

或者: 

SELECT * FROM (                SELECT  *, ROW_NUMBER() OVER (ORDER BY CreateTime DESC) AS 'RowNumberForSplit' FROM office.Conference WHERE 1=1) temp WHERE RowNumberForSplit BETWEEN 1 AND 10

 

3:WITH * AS ()   ,    Row_Number() OVER(ORDER BY *) AS rowNum 

WITH sss AS(SELECT *,ROW_NUMBER() OVER(ORDER BY CreateTime) AS rowNum FROM DBO.Message ) SELECT * FROM sss WHERE rowNum BETWEEN 11 AND 20

4: SQL Server 2012的OFFSET-FETCH筛选

SELECT * FROM DBO.Message ORDER BY CreateTime OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

 

这里第4中方法做详细介绍:

 

TOP选项是一个非常实用的筛选类型,但它有两个缺陷——不是标准SQL,且不支持跳过功能。标准SQL定义的TOP类似筛选称为OFFSET-FETCH,支持跳过功能,这对针对特定页面的查询非常有用。SQL Server2012引入了对OFFSET-FETCH筛选的支持。

SQL Server 2012中的OFFSET-FETCH筛选被视为ORDER BY子句的一部分,通常用于实现按顺序显示效果。OFFSET子句指定要跳过的行数,FETCH子句指定在跳过的行数后要筛选的行数。请思考一下下面的查询示例。

SELECT orderid, orderdate, custid, empid

FROM Sales.Orders

ORDER BY orderdate, orderid

OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

此查询按orderdateorderid顺序(订单日期从最远到最近,并添加了决胜属性(tiebreaker)orderid)排序Orders表中的行。基于此顺序,OFFSET子句跳过前50行,由FETCH子句仅筛选下面的25行。

请注意,使用OFFSET-FETCH的查询必须具有ORDER BY子句。此外,FETCH子句不支持没有OFFSET子句。如果你不想跳过任何行,但是希望使用FETCH筛选,你应当使用OFFSET 0 ROWS来表示。不过,没有FETCHOFFSET是允许的,这种情况是跳过指定的行数,并返回查询结果中所有剩余行。

OFFSET-FETCH语法有一些有趣的语言方面需要注意。单数格式ROW和复数格式ROWS是可以互换的,此举是让你能够以直观的类似英语方式来描述筛选。例如,假设你仅希望获取一行,如果你指定了FETCH 1 ROWS,虽然这在语法上是有效的,不过看上去会很怪。因此,你可以使用FETCH 1 ROW格式。此互换同样适用于OFFSET子句。另外,如果你不希望跳过任何行(OFFSET 0 ROWS),你可能觉得“first”比“next”更合适,因此,FIRST 和NEXT格式是可以互换的。

如你所见,从支持跳过功能看,OFFSET-FETCH子句比TOP子句更灵活。不过,OFFSET-FETCH 不支持PERCENTWITH TIES选项,而TOP支持。由于OFFSET-FETCH是标准的,而TOP不是,我建议使用OFFSET-FETCH作为你的默认选择,除非你需要TOP支持且OFFSET-FETCH不支持的功能。

转载于:https://www.cnblogs.com/LuoEast/p/8480259.html

你可能感兴趣的文章
【技巧】easyUI的datagrid,如何在翻页以后仍能记录被选中的行
查看>>
Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
查看>>
某篇ctr预估ppt的链接
查看>>
在CentOS7中配置网络时常见的LSB加载失败问题
查看>>
Kafka 0.7.2 单机环境搭建
查看>>
经过强制类型转换以后,变量a, b的值分别为( )short a = 128; byte b = (byte) a;
查看>>
Dcloud课程6 php脚本如何在Linux下定时更新数据
查看>>
js进阶 14-7 jquery的ajax部分为什么需要对表单进行序列化
查看>>
ubuntu下msmtp+mutt的安装和配置
查看>>
利用sqoop对mysql执行DML操作
查看>>
hibernate中视图的映射
查看>>
Ionic3 UI组件之 ImageViewer
查看>>
flask框架----flask基础
查看>>
Oracle之RMAN备份及还原
查看>>
蓝桥杯-学校的第一次练习题
查看>>
spring中注解说明
查看>>
hdu 4135 -Co-prime
查看>>
二叉树的建立与先序、中序、后序遍历
查看>>
QLabel显示图片,图片可以自适应label的大小
查看>>
阅读下面程序,请回答如下问题:
查看>>