我正在开发一个分配液体的应用程序。这是数据库的组织结构
罐:
- canister_id{PK}
- 成分_id{FK}
成分:
DRINK:
成分实例:
- 实例 ID{PK}
- 饮料_id{FK}
- 成分_id{FK}
- amount
每种饮料都有多种成分(保存在成分实例表中),但只有 12 罐。我正在尝试编写一个 SQL 命令,该命令将收集当前罐中包含所有所需成分的所有饮料。
到目前为止,这就是我所拥有的。
SELECT DISTINCT Drink.drink_name
FROM Drink, ingredientInstance, Canister
WHERE (((ingredientInstance.drink_id)=[Drink].[drink_id])
AND ((ingredientInstance.ingredient_id)
IN (select ingredient_id FROM Canister)));
然而,这将返回所有含有单一成分的饮料。我正在寻找一种方法来确保every成分实例中的关联成分,它当前位于罐中。
例如,假设drink1需要成分1 and 成分2。如果罐中存在这两种成分 ID,我希望它出现在结果中,但如果罐中只有一种或零种成分,则不会出现在结果中。
我确信这是显而易见的事情,但我想不出如何做到这一点。
这是集合内集合查询的示例。我提倡使用聚合having
对此的条款:
select drink.drinkname
from IngredientInstance ii join
Drink d
on ii.DrinkId = d.Drinkid left join
Canister c
on ii.IngredientId = c.INgredientId
group by drink.drinkname
having sum(iif(c.IngredientId is null, 1, 0)) = 0;
这是加入IngredientInstance
and Drink
只是为了获得饮料名称。然后它正在做一个left join
to the Canister
桌子。这样可以将饮料中的所有成分以及匹配的成分(如果有)保留在罐中。如果其中缺少某种成分Canister
,那么它有一个 NULLingredientId
.
The group by
按饮料看成分。决赛having
子句会计算缺失成分的数量,并且只返回没有缺失成分的饮料。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)