1. ホーム
  2. sql

[解決済み] このクエリを使用してページング(スキップ/テイク)機能を実装する

2022-04-23 09:26:07

質問

SQLでカスタムページングを実装する方法について、少し理解しようと思っています。 このような記事 .

私は以下のクエリを持っており、これは完全に動作します。しかし、私はこれでページングを実装したいと思います。

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc

私が欲しいものは何ですか?

フォーラムの投稿に、関連するエントリーがあります。最近議論された記事を選択できるように、最新のエントリーが追加された記事を取得したいのですが。

さて、quot;トップ10"ではなく、quot;トップ10〜20の最近アクティブな投稿を取得できるようにしたいのですが。

試してみたこと

記事にあるようなROW関数を実装しようとしたのですが、本当にうまくいきません。

どのように実装したらよいか、何かアイデアはありますか?

どのように解決するのですか?

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サーバーのバージョンについて、比較と例を示します。 こちら

で動作する可能性があるわけです。 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