我正在研究上面的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
我想在此模型上运行以下查询。
"查找所有有诊断的事件。名称=癌症和观察。名称=进行性疾病。"
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
但这显然是错误的,因为结果表仍然有来自“干预”的数据。表。我需要知道如何从这种干预措施中消除数据。表?还有如何为这种情况编写有效的查询。
谢谢
答案 0 :(得分:1)
由于在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'
结果:
Id event_type
1 diagnosis
3 observation
注意:在LEFT JOIN
子句中包含WHERE
的右侧表格通常会导致意外结果,因为它实际上会将LEFT JOIN
转换为INNER JOIN
通过过滤掉NULL
值。但在这种情况下,这正是我们想要做的。
答案 1 :(得分:0)
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 e1.id not in ( select event_fk from Intervention )