2011-09-28 41 views
1

以下兩個查詢不會返回相同的結果。爲什麼?Mysql拼圖:條件在ON與WHERE

注意:我發現這個問題作爲一個MySQL的難題,我沒有在這個問題上更多的數據?

SELECT table1.* 
FROM table1 LEFT JOIN table2 
ON table2.table1_id = table1.id 
AND table2.val < 5 


SELECT table1.* 
FROM table1 LEFT JOIN table2 
ON table2.table1_id = table1.id 
WHERE table2.val < 5 

回答

4

左外連接將返回行(從表2空列,如果選擇的話),當條件不滿足,而WHERE篩選出來。

+0

@MarkByers不會有在投影任何空行(要顯示哪些列),但是查詢的數據集將和所有區別 –

+0

@MarkByers在查詢1號中,將會有來自table2的NULL值。 –

+0

@Adrian,在查詢2中,通過使用'where',他已經將查詢轉換爲內部連接,如下面Robin的答案。這就是結果集不同的原因。 – Ben

1

僅當第一個查詢連接table2.val < 5。第二個過濾器即使是table1行。如果您使用INNER JOIN,則應該給出相同的結果。

3

第一個查詢將返回表1中的所有行。無論您在連接條件中寫什麼,LEFT JOIN總是返回左表中的所有行(但如果存在多個匹配,它可以重複行,但由於您正在加入一個名爲id的領域,它很可能是一個獨特的關鍵,所以不會有重複)。

第二個查詢將只從表1 其中 table2中的相應行具有val < 5返回那些行。實際上,您可以在此寫入INNER JOIN而不是LEFT JOIN,因爲由於WHERE子句,加入失敗的行不會在結果集中。

0

冥思苦想爲 「編譯看括號 ...

SELECT  table1.* 
FROM  table1 
LEFT JOIN table2 ON (
      table2.table1_id = table1.id 
      AND table2.val < 5 
) 

這個例子並在LEFT JOIN表2時的條件table2.table1_id = table1.id AND table2.val < 5是真實的。

SELECT  table1.* 
FROM  table1 
LEFT JOIN table2 ON (table2.table1_id = table1.id) 
WHERE  (table2.val < 5) 

這個例子做當條件table2.table1_id = table1.id應用LEFT JOIN,然後得到的table1 LEFT JOIN table2 ON (table2.table1_id = table1.id)結果的行WHERE條件table2.val < 5是真