Problème Multi Jointures avec des Tables possedant des "Trous" [Résolu]

Signaler
Messages postés
9
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006
-
Messages postés
9
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006
-
Salut à tous et bonne année Wink

Alors je place le décors : j'ai 5 tables :

Citation:

-patient
clef primaire PaNum

-adresse
clef primaire AdNum
clef étrangère PaNum référence à patient

-visite
clef primaire ViNum
clef étrangère PaNum référence à patient

-photo
clef primaire PhNum
clef etrangère ViNum référence à visite
clef etrangère Dicode référence à diagnostic
PhPath = Nom du fichier image

-diagnostic
clef primaire DiCode


Voila pour les tables, j'aimerais donc faire une requete de sélection de toute les informations (toute les tables) concernant la Photo ayant le nom de fichier REje14M000001 ...
en toute logique j'ai essayé cette requete en faisant une jointure entre toutes les tables :

Code:

SELECT *
FROM adresse, diagnostic, patient, photo, visite
WHERE adresse.PaNum = patient.PaNum
AND patient.PaNum = visite.PaNum
AND visite.Vinum = photo.ViNum
AND diagnostic.DiCode = photo.DiCode
AND photo.PhPath like '%REje14M000001%'


Cependant celle ci ne renvoit rien ...

Alors qu'une simple jointure + un like :

Code:

SELECT *
FROM photo, visite
WHERE visite.Vinum = photo.ViNum
And photo.PhPath like '%REje14M000001%'


Fonctionne très bien en renvoyant la ligne qui m'interesse cad les information de la visite concerné par la photo ...

Le problème vient que la base de donnée à en effet des "trous" ce qui est normal dans mon projet, car je dois détecter justement les "trous" et afficher les problèmes en vus d'un delete ou d'un update par la suite ...

Donc est ce possible de créer une requete de jointure qui affiche une ligne même partiel ?

Dans mon exemple, le nom de la photo renvois bien une photo existante, se rapportant bien à une visite, cependant cette visite ne se rapporte à aucun client et donc aucune adresse, et aucun diagnostic... J'aurrais donc aimer que la requete fasse une jointure total mais n'affiche que les données existantes cad ici une ligen contenant les informations de la photo et de la visite...
Et si il y avait eu un client et une adresse j'aurrais souhaiter que ces informations apparaissent...

Bref est ce possible au point de vue SQL ?

Pourriez vous me donner un petit coup de pouce car cela fait déja 4 heures que je planche dessus

Merci à vous Smile

5 réponses

Messages postés
9
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006

Merci pour ta réponse, je l'ai fais en plusieurs requetes, bien plus simple en cas d'erreur :)
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
31
Salut

SELECT *
FROM patient
LEFT JOIN visite
on patient.PaNum = visite.PaNum
LEFT JOIN diagnostic
on diagnostic.DiCode = photo.DiCode
LEFT JOIN adresse
on adresse.PaNum = patient.PaNum
LEFT JOIN photo
on visite.Vinum = photo.ViNum
WHERE
photo.PhPath like '%REje14M000001%'

Vas te donner peut etre une reponse.

Si du remplace left par Inner les trous de la jointure disparaissent.
INNER JOIN photo

on visite.Vinum = photo.ViNum
Que les lignes ou il y a la relation
INNER JOIN photo


on visite.Vinum = photo.ViNum
si pas de relation --> remplacement par des null
Messages postés
9
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006

Merci pour ta réponse, mais ta requete me renvoi aucune ligne, j'ai testé d'autres requetes qui donne cependant des résultat mais loin de ceux expérés :

SELECT *
FROM patient P
INNER JOIN visite V ON P.PaNum = V.ViNum
INNER JOIN photo PH ON V.Vinum = PH.ViNum
LEFT OUTER JOIN diagnostic D ON PH.DiCode = D.DiCode
LEFT OUTER JOIN adresse A ON P.PaNum = A.PaNum
WHERE PH.PhPath LIKE '%REje14M000001%'
OR A.AdNum IS NULL
OR P.PaNum IS NULL
OR V.ViNum IS NULL
OR PH.PhNum IS NULL
OR D.DiCode IS NULL

ou encore :

SELECT *
FROM patient P
INNER JOIN visite V ON P.PaNum = V.ViNum
INNER JOIN photo PH ON V.Vinum = PH.ViNum
LEFT OUTER JOIN diagnostic D ON PH.DiCode = D.DiCode
LEFT OUTER JOIN adresse A ON P.PaNum = A.PaNum
WHERE PH.PhPath LIKE '%REje14M000001%'
OR A.PaNum IS NULL
OR PH.DiCode IS NULL
OR PH.ViNum IS NULL
OR V.PaNum IS NULL

mais rien n't fait ... :(
Messages postés
9
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006

je viens de tester encore cela :

SELECT *
FROM patient P
LEFT JOIN visite V on P.PaNum = V.PaNum
LEFT JOIN diagnostic D on D.DiCode = PH.DiCode
LEFT JOIN adresse A on A.PaNum = P.PaNum
LEFT JOIN photo PH on V.Vinum = PH.ViNum
WHERE PH.PhPath like '%REje14M000001%'
OR A.AdNum IS NULL
OR P.PaNum IS NULL
OR V.ViNum IS NULL
OR PH.PhNum IS NULL
OR D.DiCode IS NULL

MySQL controle Center me dit :
"ERROR 1120: Cross dependency found in OUTER JOIN. Examine your ON conditions"
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
31
Salut

SELECT *
FROM patient P
LEFT JOIN visite V on P.PaNum = V.PaNum
LEFT JOIN diagnostic D on D.DiCode = PH.DiCode
LEFT JOIN adresse A on A.PaNum = P.PaNum
LEFT JOIN photo PH on V.Vinum = PH.ViNum
WHERE PH.PhPath like '%REje14M000001%'

Ph est utilisé avant d'etre defini

SELECT *

FROM patient P

LEFT JOIN visite V on P.PaNum = V.PaNum

LEFT JOIN photo PH on V.Vinum = PH.ViNum

LEFT JOIN diagnostic D on D.DiCode = PH.DiCode

LEFT JOIN adresse A on A.PaNum = P.PaNum

WHERE PH.PhPath like '%REje14M000001%'
Devrait mieux foinctionner