我正在研究分配液体的应用程序。这是数据库的组织
罐:
成分:
喝:
每种饮料都有多种成分(保存在IngredientInstance实例表中),但是只有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)));
但是,这将返回所有甚至具有单一成分的饮料。我正在寻找一种方法,以确保对于 componentInstance中的每个 相关成分,当前都在容器中。
举例来说,假设 Drink1 需要 原料1 和 原料2 。如果罐中同时存在这两个成分ID,我希望它出现在结果中,但是如果罐中只有一种或零种成分,则不希望它出现在结果中。
我敢肯定这很明显,但是我想不起来该怎么做。
这是组内查询的示例。我主张having为此使用带有子句的聚合:
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,Drink只是为了获得饮料的名称。然后,它正在left join对Canister表执行操作。这样可以将饮料中的所有成分以及匹配的成分(如果有)保留在罐中。如果缺少某种成分Canister,则该成分为NULL ingredientId。
IngredientInstance
Drink
left join
Canister
ingredientId
将group by在由饮料配料的外观。最后一个having子句计算缺少的成分的数量,并且只返回没有缺失的成分的饮料。
group by