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