Select Distinct ...
From Recipes As R
Where R.ingredient in(ingredient_a, ingredient_b...)
And Not Exists(
Select 1
From Recipes As R2
Where R2.Recipe = R.Recipe
And R2.Ingredient In(ingredient_d)
)
Wie Jeffrey L. Whitledge erwähnte, gibt die obige Abfrage jedes Rezept zurück, das mindestens eines hat Inhaltsstoff in der gewünschten Liste und keiner in der unerwünschten Liste. Wenn Sie jedoch Rezepte zurückgeben möchten, die alle enthalten die Zutaten in der gewünschten Liste und keine in der unerwünschten Liste, könnten Sie Folgendes tun:
Select Distinct ...
From Recipes As R
Where Exists (
Select 1
From Recipes As R2
Where R2.Recipe = R.Recipe
And R2.ingredient in(ingredient_a, ingredient_b...)
Having Count(*) = @CountOfPassedIngredients
)
And Not Exists(
Select 1
From Recipes As R2
Where R2.Recipe = R.Recipe
And R2.Ingredient In(ingredient_d)
)
In diesem Szenario müssten Sie zunächst die Anzahl der gewünschten Zutaten bestimmen.