168

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関数を記事のように実装しようとしましたが、実際にはうまくいきませんでした。

それを実装する方法はありますか?

4

6 に答える 6

348

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を使用していないと思いますよね?以前のバージョンでは、それは少し(少し)難しいです。SQLServerのすべてのバージョンの比較と例を次に示します

したがって、これはSQLServer2008で機能する可能性があります

-- 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
于 2012-11-04T18:35:21.190 に答える
12

SQL Server でこれを行うには、必要な行を指定できるように、クエリを列で並べ替える必要があります。

例:

select * from table order by [some_column] 
offset 10 rows
FETCH NEXT 10 rows only

また、これを行うときに「TOP」キーワードを使用することはできません。

詳細については、 https : //technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx をご覧ください。

于 2016-09-19T14:11:36.043 に答える