Bry*_*Ash 18 sql join where relational-division
给出以下表格:
Recipes
| id | name
| 1 | 'chocolate cream pie'
| 2 | 'banana cream pie'
| 3 | 'chocolate banana surprise'
Ingredients
| id | name
| 1 | 'banana'
| 2 | 'cream'
| 3 | 'chocolate'
RecipeIngredients
| recipe_id | ingredient_id
| 1 | 2
| 1 | 3
| 2 | 1
| 2 | 2
| 3 | 1
| 3 | 3
Run Code Online (Sandbox Code Playgroud)
如何构建SQL查询以查找recipe.name ='chocolate'和ingredients.name ='cream'的配方?
OMG*_*ies 14
使用:
SELECT r.name
FROM RECIPES r
JOIN RECIPEINGREDIENTS ri ON ri.recipe_id = r.id
JOIN INGREDIENTS i ON i.id = ri.ingredient_id
AND i.name IN ('chocolate', 'cream')
GROUP BY r.name
HAVING COUNT(DISTINCT i.name) = 2
Run Code Online (Sandbox Code Playgroud)
这里的关键点是计数必须等于成分名称的数量.如果它不是一个独特的计数,则由于重复而存在误报的风险.
Mar*_*ith 10
这称为关系分裂.这里讨论了各种技术.
尚未给出的另一种选择是双重不存在
SELECT r.id, r.name
FROM Recipes r
WHERE NOT EXISTS (SELECT * FROM Ingredients i
WHERE name IN ('chocolate', 'cream')
AND NOT EXISTS
(SELECT * FROM RecipeIngredients ri
WHERE ri.recipe_id = r.id
AND ri.ingredient_id = i.id))
Run Code Online (Sandbox Code Playgroud)