web-dev-qa-db-fra.com

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

J'ai essayé de comprendre un peu comment implémenter la pagination personnalisée en SQL, par exemple en lisant des articles comme celui-ci .

J'ai la requête suivante, qui fonctionne parfaitement. Mais je voudrais implémenter la pagination avec celui-ci.

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

Qu'est-ce que je veux

J'ai des messages sur le forum, avec des entrées connexes. Je souhaite obtenir les publications avec les dernières entrées ajoutées afin de pouvoir sélectionner les publications récemment débattues.

Maintenant, je veux pouvoir obtenir les "10 à 20 derniers messages actifs", au lieu de "10 meilleurs".

Qu'est-ce que j'ai essayé

J'ai essayé d'implémenter les fonctions du droit de passage comme dans l'article, mais vraiment sans succès. 

Des idées comment le mettre en application?

97
Lars Holdgaard

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érerais que ce soit un hack - mais il est utilisé, par exemple, par NHibernate. Utiliser une colonne judicieusement choisie comme ORDER BY est préférable)

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

Les nouveaux mots clés offset et fetch next (suivant les normes SQL) ont été introduits.

Mais je suppose que vous n'utilisez pas SQL Server 2012, à droite? Dans la version précédente, c'est un peu (un peu) difficile. Voici une comparaison et des exemples pour toutes les versions de serveur SQL: 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
220
Radim Köhler

Pour ce faire dans SQL Server, vous devez classer la requête par une colonne afin de pouvoir spécifier les lignes souhaitées.

Exemple:

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

Et vous ne pouvez pas utiliser le mot clé "TOP" pour cela.

Vous pouvez en apprendre plus ici: https://technet.Microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

5
Felipe V. R.

SQL 2008

La réponse de Radim Köhler fonctionne, mais voici une version plus courte:

select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

Source: https://forums.asp.net/post/4033909.aspx

2
JedatKinports
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

utilisez-le à la fin de votre syntaxe sélectionnée. =)

Vous pouvez utiliser une requête imbriquée pour la pagination comme suit: Paging de 4 lignes à 8 lignes où CustomerId est la clé primaire

SÉLECTIONNER les 5 meilleurs clients * WHERE Pays = 'Allemagne' ET ID client non sélectionné (SÉLECTIONNER les 3 meilleurs clients ID des clients WHERE Pays = 'Allemagne' par commande)

0
amoljdv06