2012-11-04 8 views
72

Próbowałem trochę zrozumieć, jak zaimplementować niestandardowe stronicowanie w SQL, na przykład czytając articles like this one.Wdrażaj funkcję stronicowania (przeskocz/odbierz) za pomocą tego zapytania.

Mam następujące zapytanie, które działa idealnie. Ale chciałbym zaimplementować stronicowanie z tym.

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

co chodzi Chcę

Mam posty na forum, z powiązanych wpisów. Chcę otrzymywać posty z najnowszymi wpisami, dzięki czemu mogę wybrać ostatnio omawiane posty.

Teraz chcę mieć "10 do 20 ostatnio aktywnych wpisów" zamiast "10 najlepszych".

Co mają Próbowałem

starałem się realizować funkcje rzędu, jak ta w artykule, ale naprawdę bez powodzenia.

Jakieś pomysły, jak to zrobić?

Odpowiedz

161

W SQL Server 2012 jest bardzo łatwy

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 

Jeśli chcemy pominąć BY możemy użyć

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

(wolałbym zaznaczyć, że jako hack - ale jest używany, np. przez NHibernate. Aby użyć mądrze odebranej kolumny jako ORDER BY jest preferowanym sposobem)

odpowiedzieć na pytanie:

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

nowych słów kluczowych offset i fetch next (tylko następującymi standardami SQL) zostały wprowadzone.

Ale domyślam się, że nie używasz SQL Server 2012, prawda? W poprzedniej wersji jest to trochę (trochę) trudne. Oto porównanie i przykłady dla wszystkich wersji serwera SQL: here

Tak, to może pracować w 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 
+0

Wielkie dzięki! To naprawdę dobra odpowiedź! Tylko pytanie dotyczące sql 2008. Chcę, aby ORDER BY wydarzyło się przed WHERE, ponieważ obecnie będzie sortować podzbiór, ale chcemy wybrać coś z całego zestawu ... Jakieś pomysły? :) Jeszcze raz dziękuję –

+2

Jeśli dobrze Cię rozumiem, chcesz posortować według LastDate, prawda? wtedy możemy zmienić klauzulę OVER() w ten sposób: ROW_NUMBER() OVER (ORDER BY ** MAX (Datemade) desc **). * I usuń ostatnie ZAMÓWIENIE przez PostId *. Teraz CTE należy sortować "wcześniej" w razie potrzeby. poprawny? –

+1

Dziękuję, pomogło, uwaga dotycząca próbki z 2012 roku, zamówienie jest obowiązkowe, próbowałem tego bez klauzuli order i otrzymałem komunikat "niepoprawna składnia" nie miał pojęcia, co było nie tak, dopóki nie przyjrzę się składni MSDN i dowiedziałem się, że zamówienie jest obowiązkowy. – Esen

4

W tym celu należy w SQL Server, należy nakazać zapytaniu kolumna, aby można było określić żądane wiersze.

Przykład:

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

I nie można użyć słowa kluczowego "top", kiedy to robi.

Więcej informacji można znaleźć tutaj: 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 

wykorzystuje to w końcu wybierz składni. =)

0

można wykorzystywać zagnieżdżone zapytanie do paginacji, co następuje: Strony od 4 wierszy do 8 wierszy, w których CustomerId jest kluczem podstawowym

WYBIERZ Top 5 * OD klientów WHERE Kraj = "Niemcy" I CustomerId Nie w (WYBIERZ Top 3 CustomerID od klientów WHERE Country = "Niemcy" według miast) zamówienie według miasta;

Powiązane problemy