在sql中查询父子关系

时间:2017-06-02 13:43:47

标签: sql database postgresql inheritance

ER Diagram - Inheritance

我正在研究上面的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

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

谢谢

2 个答案:

答案 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 )