查询sql中的父子关系

问题描述:

ER Diagram - Inheritance查询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 

的事件,但是这显然是因为结果表仍然有来自“干预”表的数据。我需要知道如何从这个'干预'表中消除数据?还有如何为这种情况编写一个有效的查询。

感谢

+0

编辑您的问题,并提供样本数据和期望的结果。 –

+0

我在'Diagnosis'或'Observation'表中没有看到任何'Name'或'Description'或任何东西。你怎么知道是“癌症”还是“进行性疾病”? – Siyual

+0

是的,有一个名称列。我已将它添加到示例信息。 – rehas

由于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 JOININNER JOIN。但在这种情况下,这正是我们想要做的。

+0

在这种情况下,内部连接不起作用,因为在第一个内部连接之后,事件表中的所有内容都将从event_type'diagnostics'中除外。因此,第二个内部联接将导致一个空表。 – rehas

+0

@rehas更新了答案。 – Siyual

+0

我希望有一个复杂的连接来做到这一点,没有像别名事件表连接where子句,但我想现在它罚款,只是工作:)谢谢一堆。 – rehas

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)