web-dev-qa-db-ja.com

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

このような記事 を読むなど、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関数を実装しようとしましたが、実際には運がありません。

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

113
Lars Holdgaard

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サーバーバージョンの比較と例は次のとおりです。 here

したがって、これは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
244
Radim Köhler

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

6
Felipe V. R.

SQL 2008

RadimKöhlerの答えは機能しますが、ここに短いバージョンがあります。

select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

ソース: https://forums.asp.net/post/4033909.aspx

2
Tadej
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

選択構文の最後でこれを使用します。 =)

次のようにページネーションにネストされたクエリを使用できます。CustomerIdが主キーである4行から8行へのページング

SELECT上位5 * FROM顧客WHERE Country = 'Germany' AND CustomerId Not in(SELECT上位3顧客ID FROM顧客WHERE Country = 'ドイツ' order by city)都市順;

0
amoljdv06