Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Implémenter la fonctionnalité de pagination (ignorer / prendre) avec cette requête

Dans SQL Server 2012 c'est très très facile

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

Si nous voulons ignorer ORDER BY, nous pouvons utiliser

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

(Je préfère marquer cela comme un hack - mais il est utilisé, par exemple par NHibernate. Pour utiliser une colonne judicieusement choisie car ORDER BY est la méthode préférée)

pour répondre à la question :

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

Nouveaux mots clés offset et fetch next (juste en suivant les normes SQL) ont été introduits.

Mais je suppose que vous n'utilisez pas SQL Server 2012 , d'accord ? Dans la version précédente, c'est un peu (un peu) difficile. Voici une comparaison et des exemples pour toutes les versions de SQL Server :ici

Donc, cela pourrait fonctionner dans 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