就在图9-9 (在第9章)中的SQL查询仅仅是凡人第4版之后,以下两个查询被表示为等价的解决方案,但它们显然并不等价。
问题陈述是
“I need all the recipe types, and then the matching recipe names, preparation instructions,
ingredient names, ingredient step numbers, ingredient quantities, and ingredient measurements
from my recipes database, sorted in recipe title and step number sequence.”查询1:
SELECT
Recipe_Classes.RecipeClassDescription,
Recipes.RecipeTitle,
Recipes.Preparation,
Ingredients.IngredientName,
Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount,
Measurements.MeasurementDescription
FROM
(
(
(
Recipe_Classes
LEFT OUTER JOIN Recipes
ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID
)
INNER JOIN Recipe_Ingredients
ON Recipes.RecipeID = Recipe_Ingredients.RecipeID
)
INNER JOIN Ingredients
ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID
)
INNER JOIN Measurements
ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID
ORDER BY RecipeTitle, RecipeSeqNo查询2:
SELECT
Recipe_Classes.RecipeClassDescription,
Recipes.RecipeTitle, Recipes.Preparation,
Ingredients.IngredientName,
Recipe_Ingredients.RecipeSeqNo,
Recipe_Ingredients.Amount,
Measurements.MeasurementDescription
FROM
Recipe_Classes
LEFT OUTER JOIN
(
(
(
Recipes INNER JOIN Recipe_Ingredients
ON Recipes.RecipeID = Recipe_Ingredients.RecipeID
)
INNER JOIN Ingredients
ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID
)
INNER JOIN Measurements
ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID
)
ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID
ORDER BY RecipeTitle, RecipeSeqNo在给出查询1之后,作者似乎说查询2与其等价,正如他所写。
Joining more than two tables in an alternate sequence
To solve the request I just showed you using five tables, I could have also stated the SQL as follows:查询1和查询2看起来不等价.如果您有没有菜谱的菜谱类型(书中将其描述为问题的一部分),那么查询1将不会返回这些菜谱类型,因为内部联接是在左外部联接之后解析的,从而破坏了这些行。
因此,查询1不正确。
查询2实际上将返回所有菜谱类,对于那些没有任何匹配菜谱的菜谱类具有空列值,因此,如果我们假设数据库是完整的,这样我们就不会在使用内部连接的过程中丢失一些菜谱,这似乎是正确的解决方案。
我有什么不了解如何加入工作的?我看不出它们是如何等同的。
编辑-格式化的查询,以便于阅读。
发布于 2020-05-07 11:43:33
这些查询是等价的,但不是因为所给出的原因。条件:
ON Recipes.RecipeID = Recipe_Ingredients.RecipeID将第一个查询转换为一系列INNER JOIN。
条件:
ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID将第二个查询转换为一系列INNER JOIN。
当所有的联接都是INNER JOINs时,排序就无关紧要了。
查询的格式很糟糕--作者没有使用表别名。在这方面的经验,我知道我必须努力工作,以获得查询,以“打印”在书籍和删除长表别名绝对有帮助。
https://stackoverflow.com/questions/61654086
复制相似问题