Je dois énumérer 6 bureaux médicaux dans une colonne, et le nom complet du patient dans l'autre. Si le patient n'a jamais visité ce bureau auparavant, une valeur NULL devrait apparaître.
Il n'y a qu'un seul ID par bureau dans la table MedicalOffice, mais MedicalProcedure peut avoir plusieurs ID de bureau par patient et même le même officeID pour le même patient plus d'une fois.
Suite à quelques réponses que j'ai trouvées sur SO, j'ai essayé une jointure externe gauche:
select m.Name, p.FullName from MedicalOffice m left outer join MedicalProcedure p ON m.ID = p.officeID where m.ID IN (1,2,3,4,5,6) AND p.patientID = 111 GROUP BY m.Name, p.patientID ORDER BY m.Name
Puis une jointure à gauche:
select m.Name, p.FullName from MedicalOffice m left join MedicalProcedure p ON m.ID = p.officeID where m.ID IN (1,2,3,4,5,6) AND p.patientID = 111 GROUP BY m.Name, p.patientID ORDER BY m.Name
mais je reçois seulement les bureaux où un logging existe dans la table MedicalProcedure comme ceci:
Name | FullName ---------------------------------- Office 1 Smith, John Office 2 Smith, John Office 4 Smith, John
Mais, si patientID 111 avait trois loggings dans la table MedicalProcedure pour les offices 1,2 et 4, les résultats devraient ressembler à ceci:
Name | FullName ---------------------------------- Office 1 Smith, John Office 2 Smith, John Office 3 NULL Office 4 Smith, John Office 5 NULL Office 6 NULL
Y a-t-il un moyen d'get les résultats dont j'ai besoin?
Merci!
Il suffit de déplacer la condition p.patientID = 111
dans la clause ON
. Dans Where
il modifie efficacement outer join
inner join
:
Select Distinct --< Substitute for Group By m.Name, p.FullName From MedicalOffice m Left Join MedicalProcedure p On m.ID = p.officeID AND p.patientID = 111 Where m.ID IN (1,2,3,4,5,6) /* Group By m.Name, p.patientID */ --< won't work in this example Order By m.Name
Retirer
m.ID IN (1,2,3,4,5,6)
Cette condition arrêtera la valeur nulle