SQL Server 2008 以降ではOFFSET FETCH句が利用できます。詳しくは「SQL Server 2008 以降で結果レコードセットの指定した位置から指定した個数を取り出す - OFFSET FETCH の利用」の記事を参照してください。
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_resultwhere 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条件文も同じ条件文にする必要があるがうっかり忘れてしまうことがある。