このクエリでページング(スキップ/テイク)機能を実装する 質問する

このクエリでページング(スキップ/テイク)機能を実装する 質問する

私は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

新しいキーワードoffsetfetch 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

おすすめ記事