sql - 在sql中查询父子关系

标签 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

我想在此模型上运行以下查询。

“查找具有 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 值,将 JOIN 转换为 INNER JOIN。但在这种情况下,这正是我们想要做的。

关于sql - 在sql中查询父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44330428/

相关文章:

mysql - 当我想做 if 条件 sql 时出现语法错误

php - 未找到结果时显示消息 POSTGRESQL PHP

postgresql - 在 INSERT 到表中 INSERT data in connected tables

sql - 对于 BLOB, 'length() IS NULL' 与 'IS NULL' 等效且更快吗?

mysql - mysql统计字段值的方法

mysql - 创建表而不预先定义列数

Java SQL : use previously existing result sets

sql - 如何更新sql server存储过程中的可为空的列

sql - 如何在输入参数中的第二个哈希后获取值

database - R Shiny 的数据库管理