Bonjour à tous,
Je vais essayer de vous expliquer brièvement mais clairement mon cas :
Je travaille sur une base de données de patients, ayant des consultations de différents types (le type de la consultation est repéré par le champ “IdRub”).
Ici, le but du jeu est d’afficher une liste de patients (avec leur adresse), selon des critères sur la valeur de certains champs (Items) d’un type de consultation précis.
Voici ma requête (avec Access je rappelle) :
SELECT [Patient].[PrenomPatient], [Patient].[NomPatient], [Patient].[NumVoie], [Parametre].[LibelleParam], [Patient].[NomVoie], [CodePostal].[CodePostal], [CodePostal].[Ville]
FROM (((Consultation RIGHT JOIN Patient ON ([Consultation].[IdPatient]=[Patient].[IdPatient]) And ([Consultation].[IdRub]=1551)) LEFT JOIN Parametre ON [Patient].[IdVoie]=[Parametre].[IdParam]) LEFT JOIN CodePostal ON [Patient].[IdCodePostal]=[CodePostal].[IdCodeInsee]) LEFT JOIN Item AS Item1 ON ([Consultation].[IdConsult]=Item1.IdConsult) And (Item1.IdCla=6561)
WHERE Item1.Valeur LIKE '*'
ORDER BY [Patient].[NomPatient];
Quelques explications :
J’utilise des jointures externes car tous les patients n’ont pas le type de consultation qui m’intéresse ici, et tous n’ont pas une adresse rentrée correctement (il peut manquer le code postal, le nom de la rue, etc).
La table Parametre me sert ici pour le type de voie dans l’adresse (dans la table Patient, il y a juste un champ “IdVoie”, qui est un nombre, et dans la table Parametre on a par exemple 23 qui correspond à “rue”, 24 à “avenue”, etc).
Même principe avec la table CodePostal, qui contient le nom des villes.
J’ai renommé “Item” en “Item1” tout simplement parce que le but est d’avoir plusieurs critères sur plusieurs items différents, il y aura donc plus tard un “Item2”, “Item3”, etc.
J’ai mis ‘*’ comme condition sur la valeur de l’item pour essayer de retrouver la liste complète des patients, pour voir si les jointures externes remplissent bien leur rôle (évidemment ce n’est pas le cas, elles ont l’air de se comporter comme des jointures naturelles).
Voilà le problème : j’obtiens un résultat de 746 lignes avec cette requête, alors qu’en faisant la requête suivante, j’obtiens 5779 lignes !!
SELECT [Patient].[PrenomPatient], [Patient].[NomPatient], [Patient].[NumVoie], [Parametre].[LibelleParam], [Patient].[NomVoie], [CodePostal].[CodePostal], [CodePostal].[Ville]
FROM (Patient LEFT JOIN Parametre ON [Patient].[IdVoie]=[Parametre].[IdParam]) LEFT JOIN CodePostal ON [Patient].[IdCodePostal]=[CodePostal].[IdCodeInsee]
ORDER BY [Patient].[NomPatient];
Est-ce que vous comprenez ce qui cloche ? moi pas
J’espère avoir été suffisamment clair …
Merci pour votre aide
Edit : Il y a une embrouille avec les parenthèses assez obscure : si j’édite ma requête et que je l’enregistre (sans rien modifier) il me dit “Expression de jointure non supportée”. Alors je rajoute des parenthèses : dans le left join, je mets ON ((cond1) And (cond2)) au lieu de ON (cond1) And (cond2), et là ça passe, mais ces parenthèses supplémentaires disparaissent quand je réédite ma requête !!!