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 :

Jointure sur 3 tables avec 2 requetes sur la 2eme table


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Jointure sur 3 tables avec 2 requetes sur la 2eme table
    Bonjour,

    Je galere a essayer de trouver une solution en une seule requete sur trois tables constituees comme suit :

    Table1 {ID, NOM}
    Table2 {ID, NOM_RESULT, STEP_ID, STEP_NOM, STEP_TYPE, STEP_PARENT}
    Table3 {ID, MES}

    Premiere requete ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM Table1 
    INNER JOIN Table2 ON Table1.ID = Table2.NOM_RESULT 
    WHERE Table2.STEP_NOM = 'Y1' 
      AND Table2.STEP_TYPE = 'Y2' 
      AND Table1.NOM = 'X1'
    -> Enregistrement des resultats dans une table temporaire Table_temp {ID, NOM_RESULT, STEP_ID, STEP_NOM, STEP_TYPE, STEP_PARENT}

    Deuxieme requete -> on boucle sur la table temporaire pour chaque Table_temp.STEP_ID comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM Table2 
    INNER JOIN Table3 ON Table3.ID = Table2.STEP_PARENT 
    WHERE Table2.STEP_PARENT = Table_temp.STEP_ID++
    Merci à ceux qui auront le courage d'aller jusqu'au bout

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Vous décrivez les tables, vous communiquez les requêtes que vous avez tentées, très bien, mais vous ne dites pas quel résultat vous voulez obtenir, du coup, difficile de vous aider
    Pensez aussi à préciser le SGBD

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ce que je souhaite obtenir c'est MES correspondant au NOM donné et au STEP_TYPE et STEP_NOM donnés
    Les relations sont dans les requetes

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    1) Évitez de relancer la guerre des étoiles !

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN Table2 ON Table1.ID = Table2.NOM_RESULT
    Une jointure entre un ID (normalement entier) et un NOM (généralement alphanumérique) ! Vraiment ?

    3) Vous pouvez faire plusieurs jointures dans une seule requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t3.MES
    FROM table3 t3
    INNER JOIN table2 t2 ON t2.STEP_PARENT = t3.ID
    	INNER JOIN table1 t1 ON t1.ID = t2.NOM_RESULT -- <== Vraiment ? !!!
    WHERE t1.NOM = 'X1'
    	AND t2.STEP_NOM = 'Y1'
    	AND t2.STEP_TYPE = 'Y2'

  5. #5
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci CinePhil pour cette première réponse :

    2)
    Une jointure entre un ID (normalement entier) et un NOM (généralement alphanumérique) ! Vraiment ?
    En effet, dans mon cas l'ID généré par un logiciel tierce est une chaîne hexadécimale et donc aussi alphanumérique

    3) Vous pouvez faire plusieurs jointures dans une seule requête
    Ok pour les jointures sur les 3 tables mais ce qui complique l'affaire (c'est pour cela que je suis passé par une boucle et une table temporaire intermédiaire qui par ailleurs surcharge le serveur), c'est qu'une fois ma première requête effectuée, je dois reprendre les t2.STEP_PARENT correspondants a chaque t2.STEP_ID mais sur t2 non filtrée


    Je pensais utiliser une clause IN mais je ne sais pas la mettre en pratique

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 257
    Points : 12 920
    Points
    12 920
    Par défaut
    Bonjour,
    Il est tout à fait possible de faire plusieurs jointure sur une même table dans une requête, en utilisant des alias.

    Tatayo.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    je dois reprendre les t2.STEP_PARENT correspondants a chaque t2.STEP_ID mais sur t2 non filtrée
    Vous voulez dire que voulez toutes les lignes de la table t2 et seulement les lignes de la table t3 qui satisfont la jointure ?
    Si oui, alors utilisez une jointure externe LEFT OUTER JOIN

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    @CinePhil
    Non je veux dire les champs t2.step_parent issus du filtre t2.step_id du precedent filtre avec 'Y1' et 'Y2'
    Ensuite il y aura la jointure avec t3.ID on t2.step_parent
    Ce que je ne sais pas faire c'est de recuperer les premiers resultats t2.step_id de t2 filtrée avec Y1 et Y2 pour ensuite les reappliquer comme filtre sur toute la table t2 (cette fois sans les filtres Y1 et Y2) et donc obtenir les t2.step_parent qui me serviront pour la jointure avec t3
    Dite moi si mon explication est claire
    Merci

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 257
    Points : 12 920
    Points
    12 920
    Par défaut
    Citation Envoyé par trayvou Voir le message
    Dite moi si mon explication est claire
    Merci
    Pas vraiment...
    Je pense que le mieux ici serait de nous donner un jeu de test avec le résultat attendu. Ce sera plus clair pour tout le monde.

    Tatayo.

  10. #10
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Je reprends par étape :

    Table1 {ID, NAME}
    Table2 {ID, NAME_RESULT, STEP_ID, STEP_NAME, STEP_TYPE, STEP_PARENT}
    Table3 {ID, MES}
    Pour simplifier l'écriture je renomme les tables t1, t2 et t3

    1) Premiere requête facile ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM t1 INNER JOIN t2 ON t1.ID = t2.NAME_RESULT 
    WHERE t2.STEP_NAME = 'Y1' 
      AND t2.STEP_TYPE = 'Y2' 
      AND t1.NAME = 'X1'
    De cette première requête on récupère dans t2 les t2.STEP_ID issus du filtrage des variables 'Y1' 'Y2' et 'X1' de t1 et t2, jusque là ça devrait aller

    2) deuxième requête :
    Là ou c'est le plus compliqué, je souhaite reprendre les t2.STEP_ID ci-dessus (issus du premier filtrage de t1 et t2) et les appliquer avec une nouvelle requête à nouveau sur l'ensemble de t2 (car cette même table a une arborescence incluant des liens entre colonnes en plus de la clé primaire) afin de récupérer les t2.STEP_PARENT

    3) Troisième requête facile ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM t2 INNER JOIN t3 ON t3.ID = t2.STEP_PARENT
    De cette dernière requête, je récupère tous les valeurs de t3 pour lesquelles t3.ID = t2.STEP_PARENT (issues des 2 requêtes sur t2)

    Merci pour votre aide

  11. #11
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Pour aider à la compréhension voici un exemple concret, merci encore pour votre aide :

    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
     
    Table1           
    ! ID   ! NAME   !
    !------------------!
    ! 111 ! ALPHA  !
    ! 222 ! BRAVO !
    !------------------!
     
    Table2
    ! NAME_RESULT ! STEP_ID ! STEP_NAME ! STEP_TYPE ! STEP_PARENT !
    !-------------------------------------------------------------------------------!
    ! 111                 ! aaa        !  R1              !  step2        !  5cf                !
    !-------------------------------------------------------------------------------!
    ! 222                 ! bbb        !  R2              !  step2        !  e7b               !
    !-------------------------------------------------------------------------------!
    ! 333                 ! ccc         !  R2              !  step2        !  3ac               ! 
    !-------------------------------------------------------------------------------!
    ! 555                 ! e4a        !  C4              !  step10       !  51f               !
    !-------------------------------------------------------------------------------!
     
    Table2 je trouve pour NAME_RESULT = 222 et STEP_ID = bbb --> STEP_PARENT = e7b
    Ensuite j'utilise les valeurs STEP_ID précédemment trouvées pour obtenir les nouvelles valeurs de STEP_PARENT :

    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
     
    ! NAME_RESULT ! STEP_ID ! STEP_NAME  ! STEP_TYPE ! STEP_PARENT!
    !-------------------------------------------------------------------------------!
    ! 111                 ! e7b        !  Measure R   !  step2        !  89d               !
    !-------------------------------------------------------------------------------!
    ! 777                 ! 3ac        !  Measure R    !  step2        !  5fc               !
    !-------------------------------------------------------------------------------!
    --> et je trouve pour STEP_ID = e7b --> STEP_PARENT = 89d
     
     
    Table3 on t3.IDM = t2.STEP_PARENT = 89d :
     
    ! IDM ! MEAS  !
    !---------------!
    ! eee  ! 10.1   !
    !---------------!
    ! 89d  ! 12.2  !
    !---------------!
    ! 5fc   ! 7.3    !
    !---------------!    Je trouve MEAS = 12.2 correspondant

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 257
    Points : 12 920
    Points
    12 920
    Par défaut
    Donc en gros tu veux juste faire des jointures entre 3 tables, tout simplement ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select t3.meas
    from table1
    inner join table 2 on table1.id = table2.name_result
    inner join table3 on table3.IDM = table2.STEP_PARENT
    where table2.step_name = 'bbb'

    J'ai bon ?

    Tatayo.

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    J'ai du mal à suivre, est-ce que le résultat attendu est bien eee ; 10.1 ?
    Auquel cas la question serait, si j'ai bien compris : "comment obtenir ce résultat en une seule requête plutôt que 3"

    Précisez (par un MLD par exemple) les cardinalités mini et maxi entre chacune des 3 tables, car ca n'est pas clair du tout, en tout cas pour moi

  14. #14
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    @tatayo

    Non, le resultat attendu est 89d 12.2

    La difficulté réside dans le fait que comme expliqué sur la Table2, je dois réutiliser sur cette même table un premier résultat STEP_PARENT issu du premier STEP_ID que je reutilise dans STEP_ID pour obtenir un nouveau STEP_PARENT !

    Facile a faire avec une boucle FOR et une table temporaire mais avec une requête globale ?

  15. #15
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    @escartefigue

    Les relations entre table sont :

    Table1 ID avec Table2 NAME_RESULT

    Table2 avec Table2 STEP_ID avec STEP_PARENT (boucle)

    Table2 avec Table3 STEP_PARENT avec IDM

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 257
    Points : 12 920
    Points
    12 920
    Par défaut
    Il suffit donc d'ajouter une nouvelle fois table2, avec un alias (comme je l'avais indiqué hier):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select t3.meas
    from table1
    inner join table2 on table1.id = table2.name_result
    inner join table2 as t2bis on t2bis.step_id = table2.step_parent
    inner join table3 on table3.IDM = t2bis.STEP_PARENT
    where table2.step_name = 'bbb'

    Tatayo.

  17. #17
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Tatayo

    Je vais monter une manip pour vérifier cette requête (je n'ai pas accès au serveur cette semaine) mais j'ai tout de même un doute quant à la ligne :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inner join table2 as t2bis on t2bis.step_id = table2.step_parent

    Il me semble que vous ne prenez pas en compte le fait que le STEP_PARENT final est issu de 2 filtres sur la meme table (Table2), le premier de STEP_ID et le second du nouveau STEP_PARENT issu du premier STEP_PARENT dans STEP_ID

  18. #18
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    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
    select meas
    from table3
    where idm =
    (
      select step_parent
      from table2
      where step_id =
      (
        select step_parent
        from table2
        where name_result =
        (
          select id
          from table1
          where name = 'BRAVO'
        )
        and step_name = 'R2' 
        and step_type = 'step2'
      )
    );

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 257
    Points : 12 920
    Points
    12 920
    Par défaut
    Si on remplace les sous-requêtes par des jointures, ça donne:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select t3.meas
    from table3 as t3
    inner join table2 as t2 on t2.step_parent = t3.idm
    inner join table2 as t2b on t2b.step_parent = t2.step_id
    inner join table1 as t1 on t1.id = t2.name_result
    where t2b.step_name = 'R2' and t2b.step_type = 'step2' and t1.name = 'BRAVO'

    Tatayo.

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

Discussions similaires

  1. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  2. Réponses: 0
    Dernier message: 21/10/2013, 17h30
  3. Jointure de table avec champs calculé sur serveur lié
    Par Themacleod1980 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/04/2010, 14h57
  4. Réponses: 4
    Dernier message: 23/10/2006, 09h09
  5. Réponses: 2
    Dernier message: 07/07/2005, 08h31

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