【问题标题】:query to return null values when none exist in one table查询以在一个表中不存在空值时返回空值
【发布时间】:2016-02-10 17:06:23
【问题描述】:

我需要在一列中列出 6 个医疗机构,在另一列中列出患者的全名。如果患者以前从未去过该办公室,则应显示 NULL。

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

MedicalOffice 表中每个 office 只有一个 ID,但 MedicalProcedure 可以为每个患者拥有多个 officeID,甚至同一患者的同一 officeID 可以不止一次。

根据我在 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

但是,如果患者 ID 111 在 MedicalProcedure 表中有 3 条记录用于办公室 1、2 和 4,则结果应如下所示:

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      删除

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

      此条件将停止显示空值

      【讨论】:

      • 但我只需要显示前 6 个办公室(共 73 个)。否则我该如何约束?谢谢!
      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2018-04-11
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多