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 :

Jointure entre 3 tables


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Jointure entre 3 tables
    Bonjour tout le monde,
    Je sollicite votre aide sur une problématique de jointure entre 3 tables :




    La requête de jointure que j'ai utilisé est la suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT s.ID_CONTACT, s.PRENOM, s.NOM, s.DATE_NAISSANCE, t.TYPE_TEL, p.TEL as MOBILE, p.EXT
    FROM TELS p INNER JOIN CONTACTS s ON p.FK_CONTACT = s.ID_CONTACT INNER JOIN TYPES_TEL t ON p.FK_TYPE_TEL = t.ID_TYPE_TEL
    ORDER BY id_contact


    elle me donne le résultat suivant :


    alors que je devrait avoir le résultat suivant :


    Pouvez vous m'aider pour avoir ce résultat ?

    Pour ceux qui veulent tester sur un moteur de BD, voici le code sql associé à cette problématique :

    Merci infiniment.

  2. #2
    Expert éminent
    Bonjour,
    Si je comprends bien, tu veux dans le résultat le numéro de mobile de chacun, ainsi que l'extension associée à son fixe.
    Donc à partir de cette requête:
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT s.ID_CONTACT, s.PRENOM, s.NOM, s.DATE_NAISSANCE, p.TEL as MOBILE, p.EXT
    FROM TELS s
    INNER  JOIN CONTACTS t ON t.FK_CONTACT = s.ID_CONTACT 
    INNER JOIN TYPES_TEL t ON p.FK_TYPE_TEL = t.ID_TYPE_TEL
    where t.type_tel = 'Mobile'
    ORDER BY id_contact

    Là tu ne récupères que les numéros de mobile.
    Pour avoir le numéro de poste, il faut ajouter une nouvelle jointure sur la table TELS, sur la clé FK_CONTACT, en filtrant pour n'avoir que celle dont EXT est non nulle (ou non vide, je ne sais pas).

    Attention, un contact qui n'a pas de mobile et/ou pas de fixe avec extension sera ignoré de la requête. S'il doit tout de même apparaître, il faudra utiliser des jointures externes.

    Tatayo.

  3. #3
    Expert éminent sénior
    Bonjour,

    Il me semble que des jointures OUTER sont préférables pour permettre de lister les personnes qui n'ont pas de fixe et/ou qui n'ont pas de mobile
    Du coup il faut utiliser la table CONTACT comme table INNER.


    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
    SELECT CO.ID_CONTACT
         , CO.PRENOM
         , CO.NOM
         , CO.DATE_NAISSANCE
         , TM.TEL as MOBILE
         , TF.TEL as FIXE
         , TF.EXT 
    FROM CONTACTS CO  
    LEFT OUTER JOIN TELS TM
       ON TM.FK_CONTACT= CO.ID_CONTACT
      AND TM.FK_TYPE_TEL = '2' -- Mobile
    LEFT OUTER JOIN TELS TF
       ON TF.FK_CONTACT= CO.ID_CONTACT
      AND TF.FK_TYPE_TEL = '1' -- Fixe
    ORDER BY CO.id_contact


    Par contre, je ne comprends pas l'intérêt de récupérer un attribut associé au téléphone fixe sans restituer le n° du fixe , c'est pourquoi je l'ai ajouté dans la requête

  4. #4
    Futur Membre du Club
    Merci Infiniment
    c'est résolue.