如何根据其他行有条件地选择行

问题描述

我有两个具有简单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