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

1:TOP()

SELECT TOP(20) * FROM dbo.Message WHERE Code NOT IN(SELECT TOP(10) Code FROM dbo.Message)
SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM dbo.Message SELECT * FROM #a WHERE rowNum BETWEEN 11 AND 20DROP TABLE #a;
WITH sss AS(SELECT *,ROW_NUMBER() OVER(ORDER BY CreateTime) AS rowNum FROM DBO.Message)SELECT * FROM sss WHERE rowNum BETWEEN 11 AND 20
SELECT * FROM DBO.Message ORDER BY CreateTime OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

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

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

SELECT orderid, orderdate, custid, empidFROM Sales.OrdersORDER BY orderdate, orderidOFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

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

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

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

更多相关文章

  1. Android(安卓)版本兼容 — Android(安卓)6.0 和 7.0后获取Mac地
  2. android 创建桌面快捷方式 、插件
  3. android源码下载方式
  4. 创建android逐帧动画的两种方式
  5. 【安卓笔记】android客户端与服务端交互的三种方式
  6. android触摸实现物体运动方式
  7. TabHost两种实现方式
  8. Android(安卓)RIL总体架构介绍
  9. Android-两种方式实现走马灯效果

随机推荐

  1. 我的工具太少了之Android无限轮播图片,最
  2. Android开发之XML解析PULL
  3. Android内核的编译过程
  4. [Android面试系列]一句话讲清楚Android消
  5. Android(安卓)如何在Eclipse中查看Androi
  6. 由这篇文章引发的思考“技术控解释为什么
  7. Android 使用 OpenCV (JNI 实现)
  8. 关于Android向前兼容和向后兼容问题的理
  9. Android(安卓)图标ICO设计标准与原则
  10. Activity生命周期