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 :

[ACCESS 2000] Lister les n premiers éléments de chaque groupe


Sujet :

Langage SQL

  1. #1
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut [ACCESS 2000] Lister les n premiers éléments de chaque groupe
    Bonjour,

    en parcourant hier un tutoriel trouvé sur le site de Microsoft, je suis tombé sur une mise en application intéressante des sous-requêtes corrélées et je me demandais s'il serait possible de réaliser la même chose en jointures.
    Pour tester tout ça, j'ai créé un modèle alimenté de quelques données :

    Table Groupes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    lngIdGroupe | strNomGroupe
    --------------------------
    1           | Groupe1
    2           | Groupe2
    3           | Groupe3
    Table Elements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lngIdGroupe | lngIdElement | strNomElement | lngValeurElement
    -------------------------------------------------------------
    1           | 1            | Element1      | 15
    1           | 2            | Element2      | 20
    2           | 3            | Element3      | 5
    2           | 4            | Element4      | 20
    1           | 5            | Element5      | 15
    1           | 6            | Element6      | 20
    Le but étant d'obtenir, pour chaque groupe, les 3 élements ayant la plus forte valeur.
    M'inspirant librement de la requête du tutoriel, j'ai écrit celle-ci :

    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
    SELECT   G.strNomGroupe,
             G.lngIdGroupe,
             E.lngIdElement,
             E.strNomElement,
             E.lngValeurElement
    FROM     Groupes AS G
             LEFT JOIN Elements AS E
               ON E.lngIdGroupe = G.lngIdGroupe
    WHERE    E.lngIdElement IS NULL 
              OR E.lngIdElement IN (SELECT   TOP 3 lngIdElement
                                    FROM     Elements
                                    WHERE    lngIdGroupe = E.lngIdGroupe
                                    ORDER BY lngValeurElement DESC,
                                             lngIdElement ASC)
    ORDER BY G.strNomGroupe ASC,
             G.lngIdGroupe ASC,
             E.lngValeurElement DESC
    Le résultat est donc le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    strNomGroupe | lngIdGroupe | lngIdElement | strNomElement | lngValeurElement
    ----------------------------------------------------------------------------
    Groupe1      | 1           | 6            | Element6      | 20
    Groupe1      | 1           | 2            | Element2      | 20
    Groupe1      | 1           | 1            | Element1      | 15
    Groupe2      | 2           | 4            | Element4      | 20
    Groupe2      | 2           | 3            | Element3      | 5
    Groupe3      | 3           |              |               |
    Employant rarement des sous-requêtes corrélées dans la clause WHERE, je dois dire que j'ai été assez bluffé par cette utilisation suggérée par le tutoriel (Comme quoi, on en apprend tous les jours !).
    Une fois la surprise passée , j'ai commencé à me demander s'il serait possible d'obtenir le même résultat autrement, avec une jointure par exemple. Qu'en pensez-vous ?

    Merci d'avance pour vos lumières.

  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 847
    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 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    Possible si vous êtes sur un SGBDR qui supporte les opérateurs de fenêtrage tel que ROW_NUMER() OVER...

    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
    § 1.7 Fonctions de classement et d'énumération (norme SQL:2003)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par SQLpro
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
    § 1.7 Fonctions de classement et d'énumération (norme SQL:2003)
    Intéressant, en effet !
    En conclusion, sans les opérateurs de fenêtrage que vous décrivez dans votre article, la sous-requête corrélée dans la clause WHERE est bien la seule solution ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/05/2013, 15h21
  2. Réponses: 6
    Dernier message: 05/01/2011, 14h42
  3. Réponses: 6
    Dernier message: 06/02/2009, 09h16
  4. afficher les 10 premiers enregistrements pour chaque groupe
    Par freestyler dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2008, 15h46
  5. [SQL Server 2000/05] les n premieres lignes d'un group by
    Par pierre-o dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 12h25

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