Bu sorgu ile sayfalama (atlama / alma) işlevini uygulayın


138

Biraz SQL gibi özel sayfalama, örneğin böyle makaleleri okuma hakkında nasıl anlamaya çalışıyorum .

Ben mükemmel çalışan aşağıdaki sorgu var. Ama bununla sayfalama uygulamak istiyorum.

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

Ne istiyorum

İlgili girdiler içeren forum gönderilerim var. En son eklenen girişleri içeren yayınları almak istiyorum, bu yüzden en son tartışılan yayınları seçebiliyorum.

Şimdi, "ilk 10" yerine "son 10-20 son zamanlarda aktif gönderileri" almak istiyorum.

Ne denedim

ROW işlevlerini makalede olduğu gibi uygulamaya çalıştım, ama gerçekten şanssız.

Nasıl uygulanacağı hakkında bir fikriniz var mı?

Yanıtlar:


288

Gelen SQL Server 2012 çok kolay çok olduğunu

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 terimini atlamak istiyorsak,

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

(Bunu bir hack olarak işaretlemeyi tercih ederim - ancak örneğin NHibernate tarafından kullanılır. ORDER BY olarak akıllıca toplanan bir sütun kullanmak tercih edilen bir yöntemdir)

soruyu cevaplamak için:

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

Yeni anahtar kelimeler offsetve fetch next(SQL standartlarının hemen ardından) tanıtıldı.

Ama sanırım SQL Server 2012 kullanmıyorsunuz değil mi? Önceki versiyonda biraz (biraz) zor. Tüm SQL sunucu sürümleri için karşılaştırma ve örnekler: burada

Bu SQL Server 2008'de çalışabilir :

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

Çok teşekkürler! Bu gerçekten iyi bir cevap! Sadece 2008 sql hakkında soru. SİPARİŞ TARAFININ NEREDEN önce olmasını istiyorum, şu anda altkümeyi sıralayacaktır, ancak tüm setten bir şey seçmek istiyoruz ... Herhangi bir fikir? :) Bir kez daha teşekkürler
Lars Holdgaard

2
Seni doğru anlarsam LastDate'e göre sıralamak istersiniz, değil mi? bu durumda OVER () yan tümcesini şu şekilde değiştirebiliriz: ROW_NUMBER () OVER (ORDER BY MAX (Datemade) desc ). Ve son ORDER BY PostId kaldırın . Şimdi CTE gerektiği şekilde 'daha erken' sıralanmalıdır. doğru?
Radim Köhler

1
Teşekkür ederim bu yardımcı oldu, 2012 örnek hakkında bir not, tarafından sipariş zorunludur, ben bu cümle ile sipariş olmadan deniyordu ve hata var "yanlış sözdizimi" MSDN sözdizimi içine bakmak ve zorunlu olduğunu öğrendim kadar neyin yanlış olduğunu hiçbir fikrim yoktu .
Esen

İlk satır 1 veya 0 mı? 0 ve WHERE RowNumber >= @Start AND RowNumber < @End1000 ise ilk 1000 satırı NEREDE almalı ? @Start@End
CWSpear

1
Çok teşekkür ederim
Mafii



5

SQL 2008

Radim Köhler'in cevabı işe yarıyor, ancak daha kısa bir versiyon:

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

Kaynak: https://forums.asp.net/post/4033909.aspx


-1

Sayfalandırma için iç içe sorguyu aşağıdaki gibi kullanabilirsiniz :

4 satır 8 Row çağn CustomerId olan birincil anahtar .

SELECT Top 5 * FROM Customers
WHERE Country='Germany' AND CustomerId Not in (SELECT Top 3 CustomerID FROM Customers
WHERE Country='Germany' order by city) 
order by city;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.