3

液体を分配するアプリケーションに取り組んでいます。DBの編成はこちら

キャニスター:

  • canister_id{PK}
  • 成分ID{FK}

成分:

  • 成分ID{PK}
  • 成分名

飲む:

  • ドリンクID{PK}
  • 飲み物の名前

成分のインスタンス:

  • インスタンス ID{PK}
  • ドリンクID{FK}
  • 成分ID{FK}

各ドリンクには複数の成分 (成分インスタンス テーブルに保持されます) がありますが、キャニスターは 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)));

ただし、これは、1 つの成分でも利用可能なすべての飲み物を返します。私が探しているのは、componentInstance に関連付けられているすべての成分が現在キャニスターに入っていることを確認する方法です。

たとえば、drink1には独自の成分1と成分2が必要だとします。これらの成分 ID の両方がキャニスターに存在する場合は結果に表示されますが、キャニスターに成分が 1 つまたは 0 つしかない場合は表示されません。

当然のことだと思いますが、これを行う方法が思いつきません。

4

2 に答える 2

2

これは、set-within-sets クエリの例です。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テーブルに対して実行しています。これにより、飲み物のすべての成分が、一致する成分 (存在する場合) とともにキャニスターに保持されます。成分が から欠落している場合、その成分はCanisterNULL になりますingredientId

group byドリンク別の原材料を見る。最後のhaving句は、不足している食材の数を数え、不足している食材がない飲み物のみを返します。

于 2013-05-08T18:46:53.660 に答える