Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Implementieren Sie mit dieser Abfrage die Paging-Funktion (Skip / Take).

In SQL Server 2012 es ist sehr, sehr einfach

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

Wenn wir ORDER BY überspringen wollen, können wir

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

(Ich würde das eher als Hack markieren - aber es wird verwendet, z. B. von NHibernate. Eine klug ausgewählte Spalte als ORDER BY zu verwenden, ist der bevorzugte Weg)

um die Frage zu beantworten:

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

Neue Schlüsselwörter offset und fetch next (einfach den SQL-Standards folgend) wurden eingeführt.

Aber ich vermute, dass Sie nicht SQL Server 2012 verwenden , richtig ? In der vorherigen Version ist es ein bisschen (wenig) schwierig. Hier finden Sie Vergleiche und Beispiele für alle SQL Server-Versionen:hier

Dies könnte also in SQL Server 2008 funktionieren :

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