我有一个SQL查询让我难过.基本上,我有一个食谱表,包含(你毫无疑问,猜测)许多食谱.我有一个成分表,其中包含各种成分.我有一个RecipeIngredients表,它将食谱与它使用的成分联系起来.最后,我有一个PopularIngredients表(它实际上是一个视图,但谁关心?),其中包含人们可能在厨房中最常用的成分:
CREATE Table Recipes ( RecipeId int4,Title varchar(100) ); CREATE Table Ingredients ( IngredientId int4,Name varchar(100) ); CREATE Table RecipeIngredients ( RecipeId int4,IngredientId int4,Amount int2 ); CREATE Table PopularIngredients ( IngredientId int4 );
我的目标是获得仅使用流行成分的所有食谱清单.
我正在寻找的是一个将返回鸡肉沙拉和煎饼的查询. Aligator Burgers不会退货,因为它使用的aligator不是一种流行的成分.
我尝试了一些涉及子选择和ALL关键字的事情,但没有运气.我已经尝试了各种内部和外部连接,但只要其中至少有一种成分受欢迎,配方行仍然会出现.任何帮助将非常感激!
我正在使用Postgres 9.1.
解决方法
这将获得所有没有不在PopularIngredients表中的成分的食谱.
select * from Recipes r where not exists ( select * from RecipeIngredients ri left join PopularIngredients pi on pi.IngredientId=ri.IngredientId where ri.RecipeId=r.RecipeId and pi.IngredientId is null )