私はSQLでカスタムページングを実装する方法について少し理解しようとしてきました。例えば、このような記事。
次のようなクエリがあり、これは完璧に動作します。ただし、これを使用してページングを実装したいと思います。
SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
from dbForumEntry
group by PostId ) SubQueryAlias
order by LastDate desc
私が欲しいものは何だろう
フォーラム投稿があり、関連エントリがあります。最近追加されたエントリを含む投稿を取得して、最近議論された投稿を選択できるようにしたいと考えています。
今度は、「トップ 10」ではなく、「最近アクティブな投稿のトップ 10 ~ 20」を取得できるようにしたいと思います。
私が試したこと
記事にあるように ROW 関数を実装しようとしましたが、うまくいきませんでした。
それを実装する方法について何かアイデアはありますか?
ベストアンサー1
でSQL Server 2012それはとても簡単です
SELECT col1, col2, ...
FROM ...
WHERE ...
ORDER BY -- this is a MUST there must be ORDER BY statement
-- the paging comes here
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
ORDER BYを省略したい場合は、
SELECT col1, col2, ...
...
ORDER BY CURRENT_TIMESTAMP
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
(私はむしろこれをハックとしてマークしたいのですが、NHibernate などで使用されています。賢明に選択された列を ORDER BY として使用するのが推奨される方法です)
質問に答えるには:
--SQL SERVER 2012
SELECT PostId FROM
( SELECT PostId, MAX (Datemade) as LastDate
from dbForumEntry
group by PostId
) SubQueryAlias
order by LastDate desc
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
新しいキーワードoffset
とfetch next
(SQL 標準に従った)が導入されました。
でも、あなたは使っていないと思いますSQL Server 2012、 右? 以前のバージョンでは少し難しいです。すべての SQL Server バージョンの比較と例を以下に示します。ここ
だから、これはSQL Server 2008:
-- SQL SERVER 2008
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 10,@End = 20;
;WITH PostCTE AS
( SELECT PostId, MAX (Datemade) as LastDate
,ROW_NUMBER() OVER (ORDER BY PostId) AS RowNumber
from dbForumEntry
group by PostId
)
SELECT PostId, LastDate
FROM PostCTE
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY PostId