結果レコードセットの指定した位置から指定した個数を取り出す (SQL Serverでのoffset, limit) - SQL Server

SQL Server 2008 以降

SQL Server 2008 以降ではOFFSET FETCH句が利用できます。詳しくは「SQL Server 2008 以降で結果レコードセットの指定した位置から指定した個数を取り出す - OFFSET FETCH の利用」の記事を参照してください。

SQL Server 2005 以降

SQL Server 2005 以降では ROW_NUMBER()関数を用いると簡単に実現できます。

以下のSQLはContentsテーブルをregisterdateで逆順にソートし、40件目から10件レコードを取り出すます。
SELECT * FROM (
  SELECT ROW_NUMBER() OVER(ORDER BY registerdate DESC) AS rownum,*
  FROM contents
)as rownumbered_result
where rownum between 40 and 50
SQL Server 2005 以降では上記の方法がシンプルでパフォーマンスもよいです。

以前の方法

SQL Server 2005 以前ではROW_NUMBER()関数が使えないため、以下のサブクエリを使った方法で処理します。

以下のSQLはContentsテーブルをregisterdateで逆順にソートし、30件目から10件レコードを取り出すます。
select top(10) id,title from Contents 
where id NOT IN
 (SELECT TOP 30 id FROM Contents order by registerdate desc)
order by registerdate desc;
上記の方法の場合、メインのクエリのソート条件とサブクエリのソート条件を合わせる必要があり、SQL文が冗長になってしまうことと、SQL文の編集時に片方の条件式を編集し忘れてしまうと、条件の一致が崩れ動作しなくなるといった問題があります。(下の例を参照)

少し複雑な例

select top(10) id,title from Contents 
where id NOT IN
 (SELECT TOP 30 id FROM Contents where enabled=1 and language='ja' order by registerdate desc)
where enabled=1 and language='ja' order by registerdate desc;
4行目のwhereの条件文を編集した際に、3行目のwhere条件文も同じ条件文にする必要があるがうっかり忘れてしまうことがある。

このページのキーワード
  • 結果レコードセットの指定した位置から指定した個数を取得する (SQL Serverでのoffset, limit)
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2011-01-30
iPentec all rights reserverd.