SQL选择具有三级外键间接

时间:2015-05-15 16:28:58

标签: mysql sql sqlite foreign-keys

我有以下表格:

component_cmp      [id], id_cty_cmp*, ...
comp_structure_cst [id_cty_cst*, property_cst], validation_cst, ...
comp_value_cva     [id_cmp_cva*, property_cva], value_cva, ...
comp_type_cty      [id_cty], ...

括号是主键,*外键(大致)

ComponentType拥有许多Component个,每个Component都有许多CompValue个。 每个CompType拥有许多CompStructure,它们是CompValue的“模板”。

架构有点乱,是的。

像这样(粗略的ER图):

CompTypeCty -+-----< CompStructureCst - - - - indirect -
|                                                       |
+-------< ComponentCmp -+----< CompValueCva  - - - - - - 

我想从CompValueCva中选择行,validation_cst等于给定值。这是一个非常讨厌的间接,但我相信它可以在SQL中完成。

到目前为止,我已经想出了这个,但这是错误的(给了我大量不正确的重复条目):

select cva.*
from comp_value_cva cva
left join component_cmp cmp on cva.id_cmp_cva = cmp.id
left join comp_structure_cst cst on cst.id_cty_cst = cmp.id_cty_cmp
where cst.validation_cst = 'celsius';

(这是SQLite语法,但MySQL语法也适用于我)

1 个答案:

答案 0 :(得分:0)

没关系,我是傻瓜,并没有意识到我有“复合外国间接钥匙”。

正确的查询是:

select cva.*
from comp_value_cva cva
left join component_cmp cmp on cva.id_cmp_cva = cmp.id
left join comp_structure_cst cst on (cst.id_cty_cst = cmp.id_cty_cmp AND cst.property_cst = cva.property_cva)
where cst.validation_cst = 'celsius'