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)
)
Como mencionó Jeffrey L Whitledge, la consulta anterior devolverá cualquier receta que tenga al menos una ingrediente en la lista deseada y ninguno en la lista no deseada. Sin embargo, si quisiera devolver recetas que contenían todas los ingredientes en la lista deseada y ninguno en la lista no deseada que podrías hacer:
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)
)
En este escenario, primero debe determinar la cantidad de ingredientes deseados.