IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[SQL Server] SELECT TOP n FROM


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut [SQL Server] SELECT TOP n FROM
    j'ai une petite question de débutant à poser.

    Je fais un :
    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...

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Soit la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    A +

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    Oui, c'est vrai, comme ça c'est plus élégant.
    je pourrai même faire ça avec un parametre n° de page x taille de la page.
    merci...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    si tu es sous 2005, lit l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
    au paragraphe :
    "1.7 Fonctions de classement et d'énumération (norme SQL:2003) :"
    et plus particulièrement les exemples finaux de pagination dans un jeu de résultats avec deux méthodes différentes.
    ...

    A +

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    merci.
    c'est interessant comme amélioration, mais je travaille sur du 8.0.
    dommage, car ils ont compris ce que j'attends, c'est pas grave je ferais comme si et j'attendrai de passer à 2005.

  6. #6
    Membre régulier Avatar de transistor49
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 184
    Points : 95
    Points
    95
    Par défaut
    SQLpro ton ligne me sauve la vie! merci

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    J'arrive peut-être un peu tard sur le sujet, désolé par avance si c'est le cas.

    Je suis actuellement confronté à un problème très similaire et une solution que je trouve à la fois relativement simple à mettre en œuvre et plutôt propre est d'utiliser la clause LIMIT comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM   T_LIGNES_LGN
    ORDER  BY LGN_ID
    LIMIT 25
    Là, tu récupères la valeur maximale de ta clef et pour récupérer la page suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM   T_LIGNES_LGN
    ORDER  BY LGN_ID
    WHERE LGN_ID > <la_valeur_stockée_de_ta_clef>
    LIMIT 25
    Après, quand tu dis j'avais pensé sauvegarder la PK et recommencer la recherche à partir de celle-ci, mais ça fonctionne pas..., je ne sais pas si c'est un problème pour l'enregistrer ou bien le fait de ne pas avoir trouvé comment l'enregistrer… Si c'est le 1er cas, je suis hors-sujet mais si c'est le second, j'espère avoir pu t'apporter une nouvelle réponse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL Server] select max d'un count ?
    Par chess75 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/08/2017, 15h38
  2. Réponses: 3
    Dernier message: 06/09/2006, 10h01
  3. Réponses: 10
    Dernier message: 10/05/2006, 11h44
  4. [ms sql server 2000] top 1 dans une condition de jointure ?
    Par sylvkin dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/10/2005, 18h10
  5. select top @maVar * from
    Par sacrejohn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/10/2005, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo