一种不同的方式:
版本 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 的顶部,这将允许按名称查询而不是传入 id。
select @recipeId1 = recipe_id from Ingredients where name = @Ingredient1
select @recipeId2 = recipe_id from Ingredients where name = @Ingredient2
我已经测试了版本 2,它可以工作。大多数用户在成分表上链接,在这种情况下完全不需要!
编辑3:(测试结果);
运行此存储过程时,这些是结果。
结果的格式为 (First Recipe_id ; Second Recipe_id, Result)
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'