по-другому:
Версия 2 (как хранимая процедура) исправлена
select r.name
from recipes r
where r.id = (select t1.recipe_id
from RecipeIngredients t1 inner join
RecipeIngredients t2 on t1.recipe_id = t2.recipe_id
and t1.ingredient_id = @recipeId1
and t2.ingredient_id = @recipeId2)
Редактировать 2: [прежде, чем люди начнут кричать] :)
Это можно поместить вверху версии 2, что позволит выполнять запрос по имени вместо передачи идентификатора.
select @recipeId1 = recipe_id from Ingredients where name = @Ingredient1
select @recipeId2 = recipe_id from Ingredients where name = @Ingredient2
Я тестировал версию 2,и это работает.Большинству пользователей, которые ссылались на таблицу ингредиентов, в этом случае было совершенно не нужно!
Редактировать 3: (результаты теста);
При запуске этой хранимой процедуры этиявляются результатами.
Результаты имеют формат (Первый Recipe_id; Второй Recipe_id, Результат)
1,1, Failed
1,2, 'banana cream pie'
1,3, 'chocolate banana surprise'
2,1, 'banana cream pie'
2,2, Failed
2,3, 'chocolate cream pie'
3,1, 'chocolate banana surprise'
3,2, 'chocolate cream pie'
3,3, Failed
Ясно, что этот запрос не обрабатывает случай, когда оба ограничения одинаковы, но работаетдля всех остальных случаев.
Редактировать 4: (обработка того же случая ограничения):
, заменив эту строку:
r.id = (select t1...
на
r.id in (select t1...
работает с неудачными случаями, давая:
1,1, 'banana cream pie' and 'chocolate banana surprise'
2,2, 'chocolate cream pie' and 'banana cream pie'
3,3, 'chocolate cream pie' and 'chocolate banana surprise'