首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接语句等价在书中出现不正确吗?

连接语句等价在书中出现不正确吗?
EN

Stack Overflow用户
提问于 2020-05-07 09:14:09
回答 1查看 57关注 0票数 0

就在图9-9 (在第9章)中的SQL查询仅仅是凡人第4版之后,以下两个查询被表示为等价的解决方案,但它们显然并不等价。

问题陈述是

代码语言:javascript
复制
“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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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与其等价,正如他所写。

代码语言:javascript
复制
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实际上将返回所有菜谱类,对于那些没有任何匹配菜谱的菜谱类具有空列值,因此,如果我们假设数据库是完整的,这样我们就不会在使用内部连接的过程中丢失一些菜谱,这似乎是正确的解决方案。

我有什么不了解如何加入工作的?我看不出它们是如何等同的。

编辑-格式化的查询,以便于阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 11:43:33

这些查询是等价的,但不是因为所给出的原因。条件:

代码语言:javascript
复制
ON Recipes.RecipeID = Recipe_Ingredients.RecipeID

将第一个查询转换为一系列INNER JOIN

条件:

代码语言:javascript
复制
ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID

将第二个查询转换为一系列INNER JOIN

当所有的联接都是INNER JOINs时,排序就无关紧要了。

查询的格式很糟糕--作者没有使用表别名。在这方面的经验,我知道我必须努力工作,以获得查询,以“打印”在书籍和删除长表别名绝对有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61654086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档