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 Jeffrey L Whitledge mencionou, a consulta acima retornará qualquer receita que tenha pelo menos uma ingrediente na lista desejada e nenhum na lista indesejada. No entanto, se você quiser retornar receitas que contenham todos os ingredientes na lista desejada e nenhum na lista indesejada você pode fazer:
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)
)
Nesse cenário, você precisaria primeiro determinar a contagem dos ingredientes desejados.