Bonjour,
Apres mon passage dans le forum sql on m'a tuyauté pour un probleme sur l'utilisation des jointures externes. Je me suis donc renseigné dessus mais je bloque a un certain point. Pour simplifier au maximum j'épure mes tables de tous les champs non nécessaires a la compréhension du probème :
individus (id_ind) # il s'agit d'un individu tout simple
evenements (id_event, type_event) #il s'agit d'un evenement lié a un individu, par exemple le jour de sa naissance, ou son mariage
assoc_evenements (id_individu_associe, id_event) #fait le lien entre un individu et un evenements, car il s'agit d'une relation de n a n
ma requete: avoir une liste de tous les individus, avec l'id de l'évenement de sa naissance si il est renseigné, null sinon. J'ai donc testé :
Seulement mon probleme et que en résultat j'ai plusieurs ligne par individus : autant que d'evenements qui lui sont associés, normal vu que dans mon premier left join il peut y avoir plusieurs correspondances.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select i.id_ind, e.id_event from individus i left join (assoc_evenements ae) on (i.id_ind=ae.id_individu_associe) left join (evenements e) on (ae.id_event=e.id_event and e.type_event='naissance')
J'ai testé desMais la c'est la catastrophe, j'ai tous pleins de tuples en triple ou quadruple. J'ai essayé avec un inner join au lieu du cross join, pas mieux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part LEFT JOIN (assoc_events ae, evenements e) ON (id_ind=ae.id_individu_associe AND ae.id_event=e.id_event and e.type_event='naissance')
J'ai tout de meme trouver un moyen d'y remédier, en calant une sous requetes dans le left join ainsi :
Mais je pense que je me complique la vie comme ca et que ce cas doit etre prévu par le left join non ? D'autant plus qu'il s'agit ici d'un cas bien simplifié et que en pratique ca risque de venir horriblement lourd.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select i.id_ind, r.id_event from individus i left join ((select * from assoc_evenements ae, evenements e where ae.id_event=e.id_event and e.type_event='naissance') as r) on (i.id_ind=r.id_individu_associe)
Donc j'aimerais savoir comment fait on pour appliquer son left join a des tables sur lesquelles ont a déja fait des jointures ? Ou plus simplement quelle requetes viendrait proprement à bout de mon probleme ?
Merci à tous
Partager