一尘不染

仅在满足多个子句的情况下才返回行

sql

我正在研究分配液体的应用程序。这是数据库的组织

罐:

  • canister_id {PK}
  • Ingredient_id {FK}

成分:

  • Ingredient_id {PK}
  • 成分名称

喝:

  • Drink_id {PK}
  • 饮料名称

成分:

  • instance_id {PK}
  • Drink_id {FK}
  • Ingredient_id {FK}
  • 数量

每种饮料都有多种成分(保存在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,我希望它出现在结果中,但是如果罐中只有一种或零种成分,则不希望它出现在结果中。

我敢肯定这很明显,但是我想不起来该怎么做。


阅读 232

收藏
2021-03-08

共1个答案

一尘不染

这是组内查询的示例。我主张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;

这是加入IngredientInstanceDrink只是为了获得饮料的名称。然后,它正在left joinCanister表执行操作。这样可以将饮料中的所有成分以及匹配的成分(如果有)保留在罐中。如果缺少某种成分Canister,则该成分为NULL
ingredientId

group by在由饮料配料的外观。最后一个having子句计算缺少的成分的数量,并且只返回没有缺失的成分的饮料。

2021-03-08