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ć?
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
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
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
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. =)
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;
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