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 :

Effectuer une "double" jointure externe


Sujet :

Langage SQL

  1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut Effectuer une "double" jointure externe
    Bonjour à tous!
    Je ne sais pas si c'est possible, mais je souhaiterais effectuer une double jointure externe.
    Voici un exemple basique pour illustrer mon problème:
    Il y a des CLASSE contenant des ELEVE (via ELEVE_CLASSE), chaque CLASSE à une liste d' EXERCICE (via CLASSE_EXERCICE).

    Si on veut obtenir la liste des exercices à faire pour des les élèves d'une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  [...]
    FROM ELEVE e, ELEVE_CLASSE ec, CLASSE c,
    	 CLASSE_EXERCICE ce, EXERCICE ex, 
    WHERE c.ID_CLASSE = 10
    AND e.ID_ELEVE     = ec.ID_ELEVE
    AND ec.ID_CLASSE   = c.ID_CLASSE
    AND ce.ID_EXERCICE = ex.ID_EXERCICE
    AND ce.ID_CLASSE   = c.ID_CLASSE
    Maintenant il y a la table REALISATION (ID_ELEVE, ID_EXERCICE) contenant les exercices effectués par les élève.

    Je souhaiterais obtenir la même liste que précédemment, mais en retirant les exercices défa effectués.
    Ma première idée à été d'effectuer la première requête MINUS une seconde requête listant les exercices faite. Ca fonctionne.

    Ma deuxième idée à été de faire une double jointure quui ressemblerait à quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  [...]
    FROM ELEVE e, ELEVE_CLASSE ec, CLASSE c,
    	 CLASSE_EXERCICE ce, EXERCICE ex, 
    	 LEFT OUTER JOIN REALISATION r ON ( r.ID_ELEVE = e.ID_ELEVE AND r.ID_EXERCICE = ex.ID_EXERCICE )
    WHERE c.ID_CLASSE = 10
    AND e.ID_ELEVE     = ec.ID_ELEVE
    AND ec.ID_CLASSE   = c.ID_CLASSE
    AND ce.ID_EXERCICE = ex.ID_EXERCICE
    AND ce.ID_CLASSE   = c.ID_CLASSE
    Évidemment, ça ne fonctionne pas en l'état... Ma question est donc: est-ce que c'est possible d'effectuer ce type de "double" jointure?

    Étant donné que ma solution avec MINUS fonctionne ce n'est pas bloquant pour moi, c'est plus pour ma culture personnelle!

    Merci à vous!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Tu veux bien pour tous les élèves, les exercices qu'ils n'ont pas réalisés ?
    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
    SELECT  [...]
    FROM    ELEVE_CLASSE ec
        INNER JOIN
            CLASSE_EXERCICE ce
            ON  ce.ID_CLASSE   = ec.ID_CLASSE
        INNER JOIN
            CLASSE c
            ON  ec.ID_CLASSE   = c.ID_CLASSE
        INNER JOIN
            ELEVE e
            ON  ec.ID_ELEVE    = e.ID_ELEVE
        INNER JOIN
            EXERCICE x
            ON  ce.ID_EXERCICE = x.ID_EXERCICE
    WHERE   ec.ID_CLASSE = 10
        AND NOT EXISTS
            (   SELECT  NULL
                FROM    REALISATION r
                WHERE   r.ID_ELEVE    = ec.ID_ELEVE
                    AND r.ID_EXERCICE = ce.ID_EXERCICE
            )

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Ok, merci je vais essayer tout ça!

    Et en terme de "bonne pratique" et de performance, quelle solution est à privilégiée entre la solution que vous proposez et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RequeteGlobale
    MINUS
    RequeteLignesARetirée
    ?

Discussions similaires

  1. Réponses: 24
    Dernier message: 24/07/2007, 17h48
  2. [MySQL] Sauvegarder du texte (db mysql) CR, single-quote, double-quote, etc
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2007, 11h22

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