问题描述
我有两个具有简单1:n关系的表。一张桌子包含成分及其可用性。另一个包含食谱及其各自的成分。
餐桌食谱
RecipeA | IngredientA
RecipeA | IngredientB
RecipeB | IngredientA
RecipeB | IngredientC
和餐桌配料
IngredientA | true
IngredientB | true
IngredientC | false
查询所有有可用成分的表格配方的所有行都很简单。但是,如何仅选择所有成分都可用的食谱?结果应该是
RecipeA
我认为可以使用ALL
运算符来完成此操作,但是我还没有成功。我尝试没有成功
SELECT Recipe
FROM tblRecipes
WHERE Ingredient = ALL (
SELECT Ingredient
FROM tblIngredients
WHERE Available
)
解决方法
一种方法使用聚合:
select r.recipe
from recipes as r inner join
ingredients as i
on r.ingredient = i.ingredient
group by r.recipe
having sum(iif(i.available = "false",1,0)) = 0;
sum()
正在计算给定食谱的不可用成分数。 = 0
表示“不可用”。
顺便说一句,数据模型的命名很差。您应该有三个表:
-
Recipes
,每个配方一行。 -
Ingredients
,每种成分一行。 -
RecipeIngredients
,每个食谱中每种成分一行。
考虑一个具有HAVING
条件的汇总查询,以根据可用的配料数量检查配方数量。由于True
布尔值的访问值为-1,因此条件聚合乘以-1。
SELECT r.Recipe
FROM tblRecipes r
INNER JOIN Ingredient i
r.recipe = i.recipe
GROUP BY r.Recipe
HAVING COUNT(*) = SUM(i.available = 'true') * -1