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 :

Problème jointure et exclusion


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut Problème jointure et exclusion
    Bonjour à tou(te)s
    J'ai un pb très scolaire sur une requête SQL:
    Soit 2 table T1 et T2, T1 a pour champ ID, Titre, Temp et T2 ID, IDE_T1 (clé étrangère vers T1) et ID_T3 (clé étrangère vers une autre table).
    T2 est donc une table associative (ou relationnelle) entre T1 et T3.
    Je souhaite récupérer les enregistrements de T1 dont l'ID n'apparait pas dans T2 et pour lesquels T1.Temp = 1 et T2.ID_T3 = 2.

    Je partit donc vers une jointure du style LEFT OUTER JOIN mais je n'ai pas pratiqué ce mouvement depuis qq décennies; bref:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM T1 
    	LEFT OUTER JOIN (SELECT * FROM T2 WHERE ID_T3 = 2) as TT2 ON T1.ID = TT2.ID_B2  
    WHERE T1.temp = 1 ;
    Mais cela me retourne toutes mes T1 qui ont temp=1

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  *
    FROM    T1 
    WHERE   T1.temp = 1
        AND NOT EXISTS
            (   SELECT  1
                FROM    T2
                WHERE   T2.ID_T3 = 2
                    AND T2.ID_B2 = T1.ID
            )

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Une remarque pour commencer :
    T2 ID, IDE_T1 (clé étrangère vers T1) et ID_T3 (clé étrangère vers une autre table).
    T2 est donc une table associative (ou relationnelle) entre T1 et T3.
    Puisque T2 est une table associative, elle ne devrait pas avoir d'identifiant propre. Sa clé primaire devrait être composée des deux clés étrangères.

    Et tant que j'y suis, évite la guerre des étoiles !

    Maintenant le besoin :
    Je souhaite récupérer les enregistrements de T1 dont l'ID n'apparait pas dans T2 et pour lesquels T1.Temp = 1 et T2.ID_T3 = 2.
    "dont l'ID n'apparait pas dans T2" => c'est typiquement un NOT EXISTS qu'il te faut !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT -- les_colonnes_necessaires_et_pas_etoile
    FROM T1
    WHERE T1.Temp = 1
        AND NOT EXISTS
        (
            SELECT * -- là on a le droit de mettre étoile
            FROM T2
            WHERE T2.ID_T1 = T1.ID
                AND T2.ID_T3 = 2
        )

  4. #4
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    @CinePhil: Luke, l'étoile c'est parce que quant on est un grand seigneur sith tel que moi, on a la flemme d'écrire tous les champs à sélectionner si cela ne présente pas un intérêt pour la compréhension du problème.
    Maintenant merci al1_24 et CinePhil.

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

Discussions similaires

  1. Problème jointure gauche qui ne passe plus sous MySQL 5
    Par OuiOui007 dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/09/2006, 10h33
  2. requete jointure pour exclusion
    Par vodasan dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/09/2006, 13h48
  3. Réponses: 6
    Dernier message: 04/07/2006, 11h56
  4. Problème jointure
    Par RiPSO dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/04/2006, 23h55
  5. Problème jointure de tables
    Par Carter dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/02/2006, 12h41

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