このような記事 を読むなど、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では、非常に簡単です
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
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
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
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)都市順;