我有表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;
答案 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.pid
和a.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,反之亦然。