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)
)
Như Jeffrey L Whitledge đã đề cập, truy vấn trên sẽ trả về bất kỳ công thức nào có ít nhất một thành phần trong danh sách mong muốn và không có thành phần nào trong danh sách không mong muốn. Tuy nhiên, nếu bạn muốn trả lại các công thức có chứa tất cả các thành phần trong danh sách mong muốn và không có thành phần nào trong danh sách không mong muốn mà bạn có thể làm:
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)
)
Trong trường hợp này, trước tiên bạn cần xác định số lượng các thành phần mong muốn.