自分が便利だなと思う関数とか SQL に関係するものをまとめていこうかと思います。SQL Server 2012 で追加されたものもありますので、その辺りも含めてまとめてみます。( 実際の動作は、SQL Server 2014 CTP2 で、対象となるテーブルは、AdventureWorks の Sales.SalesOrderDetail を使用しています。 )
今回は、OFFSET n ROWS - FETCH NEXT n ROWS ONLY です。この機能は、2012 から搭載されたものです。n 行目から、n 件取得するということが簡単に実現できます。
SELECT [SalesOrderID]
,[SalesOrderDetailID]
,[CarrierTrackingNumber]
,[OrderQty]
,[ProductID]
,[SpecialOfferID]
,[UnitPrice]
,[UnitPriceDiscount]
,[LineTotal]
,[rowguid]
,[ModifiedDate]
FROM [AdventureWorks2012].[Sales].[SalesOrderDetail]
ORDER BY [ModifiedDate]
OFFSET 1000 ROWS
FETCH NEXT 100 ROWS ONLY
2012 以前のバージョンでは、下記のようになります。ROW_NUMBER() を使って、BETWEEN したり...色々大変です。
SELECT [SalesOrderID]
,[SalesOrderDetailID]
,[CarrierTrackingNumber]
,[OrderQty]
,[ProductID]
,[SpecialOfferID]
,[UnitPrice]
,[UnitPriceDiscount]
,[LineTotal]
,[rowguid]
,[ModifiedDate]
FROM ( SELECT
ROW_NUMBER() OVER(ORDER BY [ModifiedDate]) AS ROWNUMBER
,[SalesOrderID]
,[SalesOrderDetailID]
,[CarrierTrackingNumber]
,[OrderQty]
,[ProductID]
,[SpecialOfferID]
,[UnitPrice]
,[UnitPriceDiscount]
,[LineTotal]
,[rowguid]
,[ModifiedDate]
FROM [AdventureWorks2012].[Sales].[SalesOrderDetail] ) AS TB
WHERE
TB.ROWNUMBER BETWEEN 1001 AND 1100
クエリが結構複雑になってしまいますね。2012 以上な人たちはアプリケーションでページングな UI が必要になった場合は、OFFSET n ROWS - FETCH NEXT n ROWS ONLY を使いましょう。
※いいなぁ。早く 2014 本出版されないですかね。
Professional Microsoft SQL Server 2014 Administration
- 作者: Adam Jorgensen,Bradley Ball,Steven Wort,Ross LoForte,Brian Knight
- 出版社/メーカー: Wrox
- 発売日: 2014/06/23
- メディア: ペーパーバック
- この商品を含むブログを見る