requête pour renvoyer des valeurs nulles lorsqu'elles n'existent pas dans une table

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.

  • Les structures de table sont simples avec MedicalOffice ayant un ID, un nom et quelques colonnes diverses.
  • MedicalProcedure a le bureauID, le nom du patient, le nom complet du patient et certaines colonnes diverses.

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