我有一个包含这些表的数据库(省略与问题无关的列,所有列都是主键):
recipes (name, ...)
ingredients (name, ...)
composition (rec_name,ing_name)
组合物通过其(唯一)名称来描述配方和成分。
我想选择所有食谱,这些食谱的成分都存在于生成白名单的给定子查询中(或排除包含非白名单成分的所有食谱)。
到目前为止,我提出了这个问题:
SELECT DISTINCT recipes.name
FROM recipes,ingredients, composition
WHERE recipes.name = composition.rec_name AND
ingredients.name = composition.ing_name
GROUP BY ingredients.name
HAVING ingredients.name = ANY (**SUBQUERY**)
通过这种方式,我可以排除非白名单成分,但是由于其他白名单成分而退回食谱(如果我删除DISTINCT
每个食谱显示的次数是多少"好&#34 ;它的成分)。如果配方含有非白名单成分,我怎么能完全取出配方呢?
我没有在问题中包含子查询,因为它相当长并且已经过测试且有效,它从SELECT ingredients.name FROM ...
开始,因此没有类型问题。< / p>
答案 0 :(得分:0)
如果要检查配方是否包含子查询中的所有成分,那么您只需计算列表中不的成分的次数。这是一种方式:
SELECT c.rec_name
FROM composition c
GROUP BY c.rec_name
HAVING sum(ing_name not in (**SUBQUERY**)) = 0;