[英]Differences using INNER and LEFT JOIN in secondary tables
我有一个关于在 3 个表之间使用三个连接的问题。 更改第二个和第三个表之间的 JOIN 类型,结果发生变化,我不明白为什么。
表 1 姓名和年龄
姓名 | 年龄 |
---|---|
账单 | 20 |
约翰 | 25 |
玛莎 | 34 |
史蒂夫 | 40 |
爱米丽 | 30 |
表 2 名称和 ID
姓名 | ID |
---|---|
账单 | 001S |
约翰 | 002B |
玛莎 | 001Z |
表 3 ID 和爱好
ID | 爱好 |
---|---|
001S | 足球 |
002B | 音乐 |
001Z | 排球 |
示例 1
SELECT NAME, HOBBIES
FROM TABLE1
LEFT JOIN TABLE2 ON TABLE1.NAME = TABLE2.NAME
LEFT JOIN TABLE3 ON TABLE2.ID = TABLE3.ID
示例 2
SELECT NAME, HOBBIES
FROM TABLE1
LEFT JOIN TABLE2 ON TABLE1.NAME = TABLE2.NAME
INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.ID
我想要所有的名字,不管他们有没有兴趣爱好。 这只发生在 EXAMPLE1 中,在 EXAMPLE2 中,查询返回带有 HOBBIES 的 NAMES,但我不明白为什么它不适用于 EXAMPLE2。 唯一的区别是 INNER,这不会影响表 1 和表 2 之间的关系。
我哪里错了?
由于您在后面的连接中使用了 INNER JOIN:
INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.ID
此条件要求该行包含TABLE2.ID
的非 NULL 值。 这排除了与TABLE2
的连接没有产生匹配的任何情况。
您可以通过对TABLE2
和TABLE3
的配对进行外部连接来解决此问题:
SELECT TABLE1.NAME, HOBBIES
FROM TABLE1
LEFT JOIN (TABLE2 INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.ID)
ON TABLE1.NAME = TABLE2.NAME;
您也可以使用RIGHT OUTER JOIN
解决它:
SELECT TABLE1.NAME, HOBBIES
FROM TABLE2 INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.ID
RIGHT OUTER JOIN TABLE1 ON TABLE1.NAME = TABLE2.NAME;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.