【问题标题】:Join 3 tables with different FKs加入 3 个具有不同 FK 的表
【发布时间】:2016-09-17 01:52:03
【问题描述】:

我试图在一个带有一些 WHERE 子句的 SELECT 查询中将 3 个表连接在一起。 表1链接表2,表2链接表3。

表格如下:

Author
PK: Author_ID
FK: Location_ID
Author_First_Name

Location
PK: Location_ID
City

Articles
PK: Article_ID
FK: Author_ID
Article_Name

到目前为止,我已经整理了这个查询,但是在确定如何加入第二个外键“Location_ID”时遇到了麻烦

SELECT 
    Articles.Article_Name 
FROM 
    Articles
        INNER JOIN Author
            ON Articles.Author_ID
        INNER JOIN Location
            ON 
WHERE Author.Author_First_Name='Sam'
AND Location.City<>'Detroit'

【问题讨论】:

    标签: sql join foreign-keys inner-join foreign-key-relationship


    【解决方案1】:

    正确的语法是这样的:

    SELECT a.Article_Name
    FROM Articles a INNER JOIN
         Author au 
         ON a.Author_ID = au.Author_ID INNER JOIN
         Location l
         ON l.Location_ID = au.Location_Id
    WHERE au.First_Name = 'Sam' AND l.City <> 'Detroit';
    

    请注意,表别名的使用使查询更易于编写和阅读。此外,您需要为ON 子句连接两个表的条​​件。

    【讨论】:

    • 嗯,Location_ID 仅在 Author 表的外键中引用。这是否意味着它必须连接到 Author 表?如果是这样,文章表中的原始选择是否仍然有效?
    • @milesg 。 . .我在您的问题中看到了这一点,但忽略了删除评论。
    • 谢谢,我想我现在明白了。最后一个问题:这是对内部联接的良好使用,还是另一种联接类型是有益的?我的理解是这样的,如果没有City,就会被过滤掉。
    • 我很确定您想要INNER JOIN,但您的问题没有足够的信息来真正决定。
    【解决方案2】:

    您忘记比较表格字段

    SELECT * FROM articles ar
    LEFT JOIN author a ON ar.author_id = a.author_id
    LEFT JOIN location l ON a.location_id = l.location_id
    WHERE a.author_first_name = 'Sam' AND l.city <> 'Detroit'
    

    【讨论】:

    • 使用 LEFT JOIN 有什么好处?
    • 使用内连接,如果您在特定文章上有空位置,则此查询不会返回该文章。使用左连接,它可以获取所有文章,甚至那些位置为空的文章。
    • @Joao Punho 是对的。在文章上使用左连接将为您提供所有文章,无论作者或位置是否可用。
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 2020-03-04
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多