Zaimplementuj funkcjonalność stronicowania (pomiń / weź) za pomocą tego zapytania

Próbowałem zrozumieć trochę o tym, jak zaimplementować niestandardowe stronicowanie w SQL, na przykład czytanie artykułów takich jak ten .

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

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

What is it I want

Mam posty na forum, z wpisami pokrewnymi. Chcę otrzymywać posty z ostatnio dodanymi wpisami, więc mogę wybrać ostatnio dyskutowane posty.

Teraz chcę być w stanie uzyskać "top 10 do 20 ostatnio aktywnych postów", zamiast "top 10".

Czego próbowałem

Próbowałem zaimplementować funkcje wiersza jako tę w artykule, ale naprawdę bez powodzenia.

Jakieś pomysły jak to wdrożyć?

Author: Community, 2012-11-04

5 answers

W SQL Server 2012 to bardzo proste

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ąć kolejność przez 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 to zaznaczyć jako hack - ale jest używany np. przez NHibernate. Aby użyć mądrze podanej kolumny jako kolejność według jest preferowany sposób)

Aby 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

Wprowadzono nowe słowa kluczowe offset i fetch next (zgodne ze standardami SQL).

Ale chyba nie używasz SQL Server 2012 , prawda ? W poprzedniej wersji jest to trochę (trochę) trudne. Oto porównanie i przykłady dla wszystkich wersji SQL server: tutaj

Więc to może działać 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
 200
Author: Radim Köhler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-17 08:01:09

Aby to zrobić w SQL Server, musisz uporządkować zapytanie według kolumny, dzięki czemu możesz określić wiersze, które chcesz.

Przykład:

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

I nie możesz użyć słowa kluczowego "TOP", gdy to robisz.

Możesz dowiedzieć się więcej tutaj: https://technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

 5
Author: Felipe V. R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-19 14:11:36

SQL 2008

Odpowiedź Radima Köhlera działa, ale tutaj jest krótsza wersja:
select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

Źródło: https://forums.asp.net/post/4033909.aspx

 3
Author: JedatKinports,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 11:21:32
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

Użyj tego na końcu składni select. =)

 1
Author: Nicolas Vinícius Sroczynski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 17:57:03

Możesz użyć zagnieżdżonego zapytania do paginacji w następujący sposób: Stronicowanie od 4 wiersza do 8 wiersza, gdzie CustomerId jest kluczem głównym

Wybierz Top 5 * od klientów WHERE Country = 'Germany' and CustomerId Not in (SELECT Top 3 CustomerID FROM Customers WHERE Country= "Germany" order by city) order by city;

 0
Author: amoljdv06,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 11:55:54