2017-02-09 78 views
1

这两个sql查询有什么区别?左连接(table1,table2)和左连接table1左连接表2有什么区别2

select * from a 
left join (b, c) 
on a.id = b.uid and a.id = c.uid 

select * from a 
left join b on a.id = b.uid 
left join c on a.id = c.uid 
+0

第一个查询不是有效的ANSI SQL。 – jarlh

+0

它在mysql5.7中有效。@ jarlh – Tang3

+1

当你不需要额外的努力就可以正确地写出非可移植的代码时,仍然是一个坏主意。 – jarlh

回答

1

让我们有这样的数据:

A  B  C 
id  uid  uid 
--  ---  --- 
1  1  2 
2 

首先,第二查询:

select * from a 
left join b on a.id = b.uid 
left join c on a.id = c.uid 

ID UID UID 
-- ---- ---- 
    1 1 NULL 
    2 NULL 2 

这应该是毫不奇怪 - 第二列从b接合,并且其中有一个在b没有数据,NULL被使用(外连接);第三列的行为相同,仅适用于c


的第一个查询,用CROSS JOIN(这相当于)重写以符合ANSI标准:

select * from a 
left join (b CROSS JOIN c) 
on a.id = b.uid and a.id = c.uid 

ID UID UID 
-- ---- ---- 
    2 NULL NULL 
    1 NULL NULL 

为什么有所有NULL S'

首先,CROSS JOIN执行,但导致一个结果只有一个行:

b.UID c.UID 
----- ----- 
    1  2 

然后,携手进行左侧,但没有列在结果的交叉连接是对于bc都将具有相同uid,因此a中的任何一行都不能匹配任何行。

0
select * from a 
left join (b, c) 
on a.id = b.uid and a.id = c.uid 

相当于

select * from a 
left join (b cross join c) 
on (a.id = b.uid and a.id = c.uid) 

在这里您可以找到详细 https://dev.mysql.com/doc/refman/5.7/en/join.html

+0

谢谢。我可以从一个b或c得到的结果没有额外的数据,我的第二个sql? – Tang3

+0

我想,你从@Jiri Tousek得到了答案 –