8

困った SQL クエリがあります。基本的に、Recipes(ご想像のとおり) 多くのレシピを含むテーブルがあります。私はIngredientsあらゆる種類の食材を含むテーブルを持っています。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
);

私の目標は、人気のある食材のみを使用したすべてのレシピのリストを取得することです。

サンプル データを含む SQL Fiddle は、ここにあります。

私が探しているのは、Chicken SaladPancakesを返すクエリです。 人気の食材ではないアリゲーターを使用しているため、アリゲーターバーガーは返品できません。

サブセレクトとALLキーワードを含むいくつかのことを試しましたが、うまくいきませんでした。さまざまな内部結合と外部結合を試しましたが、少なくとも 1 つの成分が人気がある限り、レシピ行は引き続き表示されます。どんな助けでも大歓迎です!

Postgres 9.1 を使用しています。

4

3 に答える 3

7

これは、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
)
于 2012-08-16T00:52:30.753 に答える
5

使用WHERE NOT EXISTSされる成分がどれも PopularIngrients ビューから欠落していないことを確認するために使用されます。

SELECT R.*
FROM Recipes R
WHERE NOT EXISTS (
    SELECT 1
    FROM RecipeIngredients RI
    LEFT JOIN PopularIngredients P ON P.IngredientId = RI.IngredientId
    WHERE RI.RecipeId = R.RecipeId AND P.IngredientId IS NULL
)

SqlFiddleを更新しました

于 2012-08-16T00:53:50.290 に答える
2
select r.Title
  from Recipes r
  join RecipeIngredients ri
    on r.RecipeId = ri.RecipeId
  left outer join PopularIngredients pi
    on ri.IngredientId = pi.IngredientId
 group by r.Title
 having count( case when pi.IngredientId is null then 1 end )=0

またはほぼ同じ

select r.Title
  from Recipes r
  join RecipeIngredients ri
    on r.RecipeId = ri.RecipeId
  left outer join PopularIngredients pi
    on ri.IngredientId = pi.IngredientId
 group by r.Title
 having count(pi.IngredientId)=count(ri.IngredientId)
于 2012-08-16T01:10:07.353 に答える