繁体   English   中英

我如何内部联接多个表?

[英]How do I inner join multiple tables?

我有表A,表B和表C,我想从所有表中获取匹配值(表具有不同的列)。

Table A (primary key = id)
+------+-------+
| id   | name  |
+------+-------+
| 1    | Ruby  |
| 2    | Java  |
| 3    | JRuby |
+------+-------+
Table B (pid is reference to A(id) - No primary key)
+------+------------+
| pid  | name       |
+------+------------+
| 1    | Table B    |
+------+------------+
Table C (primary key = id, pid is reference to A(id))
+------+------+------------+
| id   | pid  | name       |
+------+------+------------+
| 1    | 2    | Table C    |
+------+------+------------+

所以我下面的查询什么也没返回。 怎么了 当存在多个内部联接时,是否将其视为AND?

Select A.* from A 
  inner join B ON a.id = b.pid
  inner join C ON a.id = c.pid;

初次加入时

1 | Ruby | Table B

然后尝试加入Table C ,上述结果中没有pid 2匹配项,因此结果为空。

内部联接会排除所有不匹配的内容。 因此,在与B对抗后,您只剩下一个记录(id = 1)。 您对C的内部联接没有剩余的匹配项,因此您一无所获。

我想union可以解决这个问题:

select A.* from A join B on a.id = b.pid
union
select A.* from A join C on a.id = c.pid

或还有其他方法,例如where a.id in (select pid from b) or a.id in (select pid from c)

当您像这样进行内部a.id = b.pid ,需要存在A一行,以便a.id = b.pida.id = c.pid为true。 如果检查示例中的行,您会发现A中的每个单独条件都有一行,但是没有行同时满足这两个条件。 这就是为什么您什么也得不到的原因:满足a.id = b.pid的行不满足a.id = c.pid ,反之亦然。

您可以使用外部联接来产生两个结果:

select *
  from A 
  left outer join B ON a.id = b.pid
  left outer join C ON a.id = c.pid;

a.id   a.name  b.pid   b.name    c.id   c.pid  c.name
  1  | Ruby  |   1   | Table B | NULL | NULL |  NULL
  2  | Java  | NULL  |  NULL   |  1   |   2  | Table C

当然,您什么也不会退! 表A和B的内部联接返回表A的第一条记录(表A ID = 1),然后联接表C,没有匹配的行联接表C,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM