如何内连接多个表?

时间:2014-08-22 14:48:40

标签: mysql sql

我有表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;

4 个答案:

答案 0 :(得分:1)

当你第一次加入时

1 | Ruby | Table B

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

答案 1 :(得分:1)

内部联接排除了所有不匹配的内容。所以在你加入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)

答案 2 :(得分:0)

当您像这样进行内部联接时,需要存在A的单行,以便a.id = b.pida.id = c.pid同时为真。如果检查示例中的行,您会发现每个条件的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

答案 3 :(得分:0)

当然你没有回报! 表A和B内连接返回表A的第1条记录(表A ID = 1) 然后你加入表C,没有匹配的行来连接表C,反之亦然。