查询sql中的父子关系
问题描述:
我正在研究上面的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
我要运行这个模型下面的查询。
“找到所有具有diagn.name =癌症和observation.name =进行性疾病的事件。”
The result should contain event id 1 and 3
我试图与加入做到这一点,但不能只选择其中的类型诊断中的一种或intervention.I可以加入两个表
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'
结果:
Id event_type
1 diagnosis
3 observation
注:包括WHERE
子句中的一个LEFT JOIN
的右侧表通常导致意外的结果,因为它基本上是由滤除NULL
值变换LEFT JOIN
成INNER JOIN
。但在这种情况下,这正是我们想要做的。
答
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)
编辑您的问题,并提供样本数据和期望的结果。 –
我在'Diagnosis'或'Observation'表中没有看到任何'Name'或'Description'或任何东西。你怎么知道是“癌症”还是“进行性疾病”? – Siyual
是的,有一个名称列。我已将它添加到示例信息。 – rehas