2012-11-04 7 views
72

articles like this oneのように、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関数を実装しようとしています。

これを実装する方法はありますか? SQL Server 2012の

答えて

161

私たちが

SELECT col1, col2, ... 
    ... 
ORDER BY CURRENT_TIMESTAMP 
OFFSET  10 ROWS  -- skip 10 rows 
FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

を使用することができ、ORDER BYをスキップしたい場合(私はむしろハックとして、そのマークたい

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 

非常に非常に簡単です。 - しかし、それは、例えば、NHibernateで使用されています。ORDER BYが好ましい方法であるように、賢明に選ばれた列を使用するには)

to質問に答える:(ちょうどSQL標準に従う)

--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 Server 2012、右?以前のバージョンでは少し難しかったです。ここでは、すべてのSQLサーバーのバージョンの比較および実施例は次のとおりです。here

だから、これはSQL Server 2008ので仕事ができる:SQL Serverでこれを行うために

-- 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 
+0

ありがとうございました!それは本当に良い答えです! SQL 2008に関する質問のみ。 ORDER BYをWHEREの前に実行したいのですが、現在はサブセットをソートしていますが、セット全体から何かを選択したいのですが...アイデアはありますか? :) もう一度、ありがとうございます –

+2

私はあなたを正しく理解していれば、あなたはLastDateで並べ替えるのでしょうか?次のようにOVER()節を変更できます。ROW_NUMBER()OVER(ORDER BY ** MAX(Datemade)desc **) *最後のORDER BY PostId *を削除します。現在、CTEは必要に応じて「早く」ソートする必要があります。正しい? –

+1

ありがとう、これは助け、2012年のサンプルに関する注記は必須です、私は句で順序を使わずにこれを試していたし、 "間違った構文" MSDNの構文を見て、必須です。 – Esen

4

、あなたがして、クエリを注文する必要があります列を指定して、必要な行を指定することができます。

例:

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

1
OFFSET  10 ROWS  -- skip 10 rows 
FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

はあなたの選択の構文の最後にこれを使用します。ここで=)

3

SQL 2008

Radimケーラーの答えの作品が、短いバージョンです:

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

0

: CustomerIdが主キーである4行から8行へのページング

選択トップ5 *お客様から 国= 'ドイツ'とCustomerIdにはありません(選択トップ3 CustomerIDからお客様 国= 'ドイツ'都市別) 都市別の注文;

関連する問題