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é :

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')
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.

J'ai testé des
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')
Mais 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.

J'ai tout de meme trouver un moyen d'y remédier, en calant une sous requetes dans le left join ainsi :
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)
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.

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