2014-06-05 98 views
0

我有這些表的數據庫與值相關的子查詢結果的所有行(省略的問題不相關的列,所有列是主鍵):從查詢排除

recipes (name, ...) 
ingredients (name, ...) 
composition (rec_name,ing_name) 

組合物涉及的食譜和他們(獨特的)名字的成分。

我想選擇所有食譜的成分全部出現在產生白名單的給定子查詢中(或排除包含非白名單成分的所有食譜)。

到目前爲止,我這個過來:

SELECT DISTINCT recipes.name 
FROM recipes,ingredients, composition 
WHERE recipes.name = composition.rec_name AND 
    ingredients.name = composition.ing_name 

GROUP BY ingredients.name 

HAVING ingredients.name = ANY (**SUBQUERY**) 

這樣我可以排除非白名單的成分,但配方返回由於其他列入白名單的成分(如果我刪除DISTINCT每個食譜顯示出來它是由許多「好」成分構成的)。一旦它包含非白名單成分,我怎樣才能完全刪除食譜?

我沒有在問題中包含子查詢,因爲它相當長,並且已經過測試並且可以正常工作,它開始像SELECT ingredients.name FROM ...那樣沒有類型問題。

回答

0

如果您想檢查配方是否包含子查詢中的所有成分,那麼您可以簡單計數列表中成分爲而非的次數。這裏有一種方法:

SELECT c.rec_name 
FROM composition c 
GROUP BY c.rec_name 
HAVING sum(ing_name not in (**SUBQUERY**)) = 0; 
+0

好的,它的工作原理!謝謝,我一直在想我的方式,想不到配料 –