我需要在一列中列出6个医疗办公室,在另一列中列出患者的全名。 如果患者以前从未去过该办公室,则应出现空。
- 表格结构很简单,医疗办公室有一个ID,名称和一些杂列。
- 医疗程序有办公室 ID、患者 ID、患者全名和一些杂项列。
MedicalOffice 表中每个办公室只有一个 ID,但 MedicalProcedure 可以为每位患者提供多个办公室 ID,甚至可以多次为同一患者使用同一办公室 ID。
根据我在SO上找到的一些答案,我尝试了左外连接:
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
然后是左连接:
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
但我只得到医疗程序表中存在记录的办公室,如下所示:
Name | FullName
----------------------------------
Office 1 Smith, John
Office 2 Smith, John
Office 4 Smith, John
但是,如果 patientID 111 在办公室 1、2 和 4 的医疗程序表中有 3 条记录,则结果应如下所示:
Name | FullName
----------------------------------
Office 1 Smith, John
Office 2 Smith, John
Office 3 NULL
Office 4 Smith, John
Office 5 NULL
Office 6 NULL
有没有办法得到我需要的结果?
谢谢!
只需将p.patientID = 111
条件移动到ON
子句中即可。在Where
,它有效地将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
删除
m.ID IN (1,2,3,4,5,6)
此条件将停止空值显示