2017-02-09 77 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得到了答案 –