2017-03-06 114 views
0

我理解左連接應該做什麼?MySQL左連接比單獨的「左」表更大嗎?

我有一個查詢。將其稱爲查詢A.它返回19條記錄。

我有另一個查詢,查詢B.它返回1,400條記錄。

我插入查詢B插入查詢作爲左加入,讓查詢A變成:

SELECT * 
FROM tableA 
LEFT JOIN (<<entire SQL of Query B>>) ON tableA.id = tableB.id 

現在,左連接意味着一切從表A,並從B表只記錄了他們相匹配。所以無論如何,這個混合查詢不應該返回比原始查詢A返回的19條記錄更多的東西。我實際得到的是1,000條記錄。

我從根本上誤解了LEFT JOIN的工作原理嗎?

+0

什麼是'tableA'和tableB'之間的關係行?如果'tableA'與'tableB'有一個_one-to-many_關係,那麼結果集聽起來正確。 – Cameron

+0

例如3 x 3 = 9 – Strawberry

回答

2

你並不完全誤解LEFT JOIN,其結果暗示了這一點。如果你在A中只有一行,在B中有1000在B中引用A中單行的ID;你的結果將是1000行。 你忽略了這種關係可能是一對多關係。「左」表/子查詢的大小(取決於WHERE條件)是下界的結果數量。

+0

啊......這可能正是我所需要的。因此,我可能需要類似DISTINCT或GROUP BY的東西來收緊。 –

+0

其他答案也很有用;但這是第一次,並給了我我需要的東西。謝謝 –

+0

@StephenR「DISTINCT」或「GROUP BY」的功能在這種情況下比INNER JOIN或甚至簡單的單一表「SELECT」更有用。 – Uueerdo

1

是的,你有點誤解。

現在,左連接意味着表A中的所有內容,並且只有表B中的記錄匹配。

到目前爲止,這麼好:只有根據您在ON子句中指定的規則與表A匹配時,表B中的數據纔會包含在內。

所以無論如何,這個混合查詢應該不會超過原始查詢A返回的19條記錄。

這似乎是很有道理,直到你意識到表B多行可以在表A匹配同一行。假設你在表A中有兩行,一個是A_ID=1,另一個是A_ID=3;其中一行是A_ID=1,另一個是A_ID=3;另一個是A_ID=3。表B中10行;表B中的5行具有A_ID=1,並且5具有A_ID=2。表B中的所有行對於B_ID具有不同的值。

如果您使用左連接且條件A_ID必須匹配,您會得到哪些行?

  • 從表A與A_ID=3該行會出現一次,與B_ID一個NULL值,因爲在表B沒有行與之匹配。
  • 表B中的5行與A_ID=2完全不會顯示,因爲它們不匹配表A中的任何行。
  • 來自表B的5行與A_ID=1全部顯示出來,每個與來自表A的1行與A_ID=1合作。

所以,你得到6分的結果,即使當時只有2表A