Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zaimplementuj funkcję stronicowania (pomiń / weź) za pomocą tego zapytania

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ąć ORDER 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 oznaczyć to jako hack – ale jest to używane np. przez NHibernate. Preferowany jest użycie mądrze wybranej kolumny jako ORDER BY)

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

Nowe słowa kluczowe offset i fetch next (zgodnie ze standardami SQL).

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

Może to więc 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak programowo określić, które tabele SQL mają kolumnę tożsamości?

  2. ExecuteScalar vs ExecuteNonQuery podczas zwracania wartości tożsamości

  3. Zwróć numer partycji dla każdego wiersza podczas wysyłania zapytań do tabeli partycjonowanej w SQL Server (T-SQL)

  4. Jak znaleźć port dla MS SQL Server 2008?

  5. Zastąp Optymalizator zapytań dla połączeń T-SQL za pomocą FORCEPLAN