我有以下表格:
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语法也适用于我)
答案 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'