查询在一个表中不存在时返回空值

时间:2016-02-10 17:06:23

标签: sql-server sql-server-2008 tsql sql-server-2008-r2 sql-server-2012

我需要在一列中列出6个医疗办公室,在另一列中列出患者的全名。如果患者之前从未访问过该办公室,则应出现NULL。

  • 表结构很简单,MedicalOffice有一个ID, 名称和一些杂项列。
  • MedicalProcedure有 officeID,patientID,患者的全名,以及一些杂项 列。

MedicalOffice表中每个办公室只有一个ID,但是MedicalProcedure每个患者可以拥有多个officeID,甚至同一个患者的办公室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

但是我只能在MedicalProcedure表中找到记录存在的办公室:

    Name       |    FullName
----------------------------------
Office 1         Smith, John
Office 2         Smith, John 
Office 4         Smith, John

但是,如果PatientID 111在第1和第4办公室的MedicalProcedure表中有3条记录,则结果应如下所示:

Name       |    FullName
----------------------------------
Office 1         Smith, John
Office 2         Smith, John 
Office 3         NULL
Office 4         Smith, John
Office 5         NULL
Office 6         NULL

有没有办法得到我需要的结果?

谢谢!

2 个答案:

答案 0 :(得分:4)

只需将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

答案 1 :(得分:1)

删除

m.ID IN   (1,2,3,4,5,6)

此条件将停止空值显示