我有一个数据库,其中包含一份成分表和食谱R表。这两个表有多对多的关系,因为一个配方使用了许多成分,而且许多食谱中都使用了一种成分。我有第三个交叉引用表,使用cross-reference validation pattern来强制执行我的多对多关系,并使用字符串外键(而不是整数)完成。
假设我的数据库之外有一系列成分C,我怎样才能查询配方表R中每个可以使用C中提供的成分列表制作的配方?
需要考虑的其他事项
1)速度(当然)最终会成为一个问题,但正确性是我现在所坚持的。
2)成分C的收集可能非常大(约100种成分)。
任何答案,甚至只是指向正确方向的指针都将非常感激。
谢谢,
艾力
答案 0 :(得分:5)
一种方法是写:
select ...
from R
where ID not in
( select R_ID
from RI
where I_ID not in
( select I_ID
from C
)
)
;
即:从C
开始。选择C
中成分不的所有配方成分交叉参考。这将为您提供仅使用C
中的成分无法制作的所有配方的集合。然后,选择不在该集合中的所有配方。