我正在处理上面的 ER 图。现在,一个事件完全参与了子表,这意味着一个事件可以是观察、干预或诊断,但单个事件永远不会存在于多个子表中。
所以事件表有:
id | event_type
1 | diagnosis
2 | diagnosis
3 | observation
4 | observation
5 | intervention
诊断表有:
id | name | event_FK
1 |cancer | 1
2 |none | 2
观察表有:
id| name | event_FK
1 |progressive disease | 3
2 |none | 4
我想在此模型上运行以下查询。
“查找具有 diagnosis.name=cancer 和 observation.name=progressive disease 的所有事件。”
The result should contain event id 1 and 3
我正在尝试通过连接来做到这一点,但不能只选择诊断或干预类型的事件。我可以将这两个表连接为
select * from event e1
left join diagnosis d on d.event_fk = e1.id
left join observation o on o.event_fk e1.id
但这显然是错误的,因为结果表中仍然包含来自“干预”表的数据。我需要知道如何从这个“干预”表中删除数据?以及如何为这种情况编写有效的查询。
谢谢
最佳答案
由于 WHERE
子句在 LEFT JOIN
之后执行,您可以利用它并添加一个 WHERE
查询的子句过滤掉任何不具有这些值的内容:
Select E.*
From Event E
Left Join Diagnosis D On D.Event_FK = E.Id
Left Join Observation O On O.Event_FK = E.Id
Where D.Name = 'Cancer'
Or O.Name = 'Progressive Disease'
Results:
Id event_type
1 diagnosis
3 observation
注意:在 WHERE
子句中包含 LEFT JOIN
的右侧表通常会导致意外结果,因为它本质上转换了 LEFT通过过滤掉
转换为 NULL
值,将 JOININNER JOIN
。但在这种情况下,这正是我们想要做的。
关于sql - 在sql中查询父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44330428/