【问题标题】:How to conditionally select rows based on other rows如何根据其他行有条件地选择行
【发布时间】:2020-12-24 10:37:28
【问题描述】:

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

【问题讨论】:

    标签: sql ms-access count subquery relational-division


    【解决方案1】:

    一种方法使用聚合:

    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 每个食谱中的每种成分都有一行。

    【讨论】:

    • 谢谢,这是一个不错的方法。我猜你的意思是on r.ingredient = i.ingredient
    • @Nikno 。 . .谢谢你。这就是我的意思。
    • 注意:MS Access SQL要求join具体:inner joinleft join等,否则会报错。
    • @Parfait 它还需要i.available = false 不带引号,或者i.available = 0
    • @GordonLinoff 我实际上按照你的建议有 3 张桌子,不过我认为这会使问题复杂化。
    【解决方案2】:

    考虑使用HAVING 条件的聚合查询来检查配方计数与可用成分计数。由于 True 布尔值的 Access 值为 -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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      相关资源
      最近更新 更多