[SQL Server] SELECT TOP n FROM
j'ai une petite question de débutant à poser.
Je fais un :
Citation:
SELECT TOP 25 toto FROM machin
pour obtenir les 25 première lignes de ma table.
Comment faire au mieux pour obtenir les pages suivantes :
de 26 à 50, 51 à 75, 76 à 100. etc...
j'avais pensé sauvegarder la PK et recommencer la recherche à partir de celle-ci, mais ça fonctionne pas...
Pagination par bloc de ligne...
Bonjour SQLPro,
J'ai recherché sur plusieurs sites les possibles réponses à mon problème et visiblement, c'est ici même que j'ai trouvé plusieurs voies à explorer.
Avant toute chose, mon environnement de bases de données est MsAccess 2007 (oui je sais, ça fait doucettement sourire...;-)). Mon choix s'est fait parce que le MDAC est installé avec le système d'exploitation et les développements que je réalise ne nécessitent pas un support réseau avec accès multi-utilisateurs. Cependant, quelques tables très volumineuses (villes d'europe) commencent à rendre certaines appliques un peu poussives... J'ai donc modifié l'ouverture à cette table pour y accéder par un principe de pagination.
J'ai suivi un certain nombre de requêtes comme celle que vous décrivez ci-après et qui me semblait d'un point de vu SQL répondre exactement à mes besoins.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| CREATE TABLE T_LIGNES_LGN
(LGN_ID INT NOT NULL IDENTITY PRIMARY KEY,
LGN_DATE VARCHAR(256))
-- les 25 premières lignes :
SELECT TOP 25 *
FROM T_LIGNES_LGN
ORDER BY LGN_ID
-- les 25 suivantes :
SELECT TOP 25 *
FROM T_LIGNES_LGN
WHERE LGN_ID NOT IN (SELECT TOP 25 LGN_ID
FROM T_LIGNES_LGN
ORDER BY LGN_ID)
ORDER BY LGN_ID
-- les 25 d'encore après :
SELECT TOP 25 *
FROM T_LIGNES_LGN
WHERE LGN_ID NOT IN (SELECT TOP 50 LGN_ID
FROM T_LIGNES_LGN
ORDER BY LGN_ID)
ORDER BY LGN_ID
etc... |
Or cette solution a un défaut majeur : sa performance. MsAccess 2007 met plus de 20mns à m'afficher le résultat...
Une autre solution trouvée par ailleurs sur le web qui donne un meilleur résultat (mais pas encore satisfaisant à mon gout) est la suivante :
Code:
1 2 3 4 5
| SELECT L.CityID, L.StateID, L.CntyID, L.ISOCodeA2, L.ZipCode, L.Name
FROM (SELECT TOP 200 CityID, StateID, CntyID, ISOCodeA2, ZipCode, Name FROM Cities ORDER BY CityID)
AS L LEFT JOIN (SELECT TOP 100 CityID, Name FROM Cities ORDER BY CityID) AS R ON L.CityID = R.CityID
WHERE R.CityID IS NULL
ORDER BY L.CityID; |
Et puis, j'ai tenté d'essayer votre solution présentée sur le lien suivant
http://sqlpro.developpez.com/SQL_Server_2K5/N1.php (point 1.7)
Code:
1 2 3 4 5
| SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY USR_ID) RNUM,
USR_ID, USR_NOM, USR_PRENOM,
FROM T_UTILISATEUR_USR) T
WHERE RNUM BETWEEN 10 AND 19 |
mais là, j'obtiens de MSAccess un syntax error en bonne et due forme dont le détail est :
Syntaxe error (missing operator) in query expression 'ROW_NUMBER() OVER(ORDER BY CityID) RNUM'
Dois malheureusement en conclure que MSAccess 2007 ne peut interpréter ce type d'argument ??
Par ailleurs, j'ai également trouvé un lien vraiment très intéressant sur le sujet de la pagination
http://databases.aspfaq.com/database...recordset.html
et particulièrement le tableau comparatif des performances de chacune des solutions mises en oeuvre. La plus rapide intitulée ROWCOUNT décrit une "stored procedure". Là encore, grosse déception de MSAccess qui ne reconnait pas les procédures stoquées !!!
Quels sont les choix qu'il me reste ? Dois-je imaginer un passage sous un MsSQL Express ??
Merci de votre aide
Laurent