2017-02-24 52 views
0

讓我們說,我有以下的列和數據兩個簡單的表:LEFT JOIN - 兩個表使用相同的數據

Table 1    Table 2 

year month   year month 
2017 01    2017 01 
2016 12    2016 12 

主鍵是由年份和月份的一個組合鍵。

因此,一個經典的左連接,給我左表中的所有數據和右表中的匹配行。

如果我做了左連接是這樣的:

select 
t1.year, t2.month 

from 
table1 t1 
    left join table 2 t2 on (t1.year = t2.year and t1.month = t2.month) 

爲什麼我得到的只有兩行?我不應該得到4行?

TNX, 湯姆

+0

't1'沒有'god'列。 –

+2

你應該得到2行。't1'中有兩行與't2'中的兩行完全匹配。你預期的輸出是什麼,你會得到4條記錄?也許你正在將LEFT OUTER JOIN與CROSS JOIN混淆,你會得到一個笛卡爾產品? – JNevill

+0

我有點困惑,不應該查詢查找在第二個表中的第一個表的主鍵上匹配的行嗎?由於左連接總是要顯示錶1中的所有數據,爲什麼表2中的數據被丟棄(即使它是相同的)? Tom –

回答

2

一個經典的左連接會給你在「左表」的行數乘以在「右表」匹配的數量(一個從)(一在這種情況下爲LEFT JOIN),加上LEFT表中第一個表中沒有匹配的所有行。

  • 在左邊的表中的行數= 2
  • 中右表的匹配總數= 1
  • 在左邊的表中的行數withouth的匹配= 0

2×1 + 0 = 2

編輯:實際上乘法是給每一行。會像

總和(row_i X matches_i)+無與倫比

哪裏row_i是指每一行,並matches_i爲在第一個表中第i行的比賽。與此不同的是,每行可能會有不同數量的匹配(前面的公式只適用於你的情況)

這將導致

1(ROW1)×1(比賽爲第1行)+ 1(ROW2)X 1(用於行2)+ 0(在表1中不匹配的行)=導致

的1x1 + 1x1的+ 0 =導致

1 + 1 = 2 =導致

比賽

如果您預計有4行,您可能想獲得笛卡爾積。如註釋所述,您可以在此情況下使用交叉連接

+0

結論是正確的,但不是解釋。第二張表的兩行匹配。右表中的匹配數爲2. –

+0

我更新瞭解釋。無論如何,我從來沒有說過,第二張桌子上有幾排無與倫比的排 - 也許我不清楚我想說什麼 –

0

您將得到兩行,因爲兩列都有兩行完全匹配山姆及其組合鍵。 如果你每行有4行,你將只能得到4行。

0

左連接將Table1(t1)作爲左表。 它搜索並檢索右側的所有值,即: - 從表2(t2)匹配標準T1.Year & Month = T2.Year & Month(別名GOD/s)以及附加連接條件T1.Month = T2.Month。結果是T1中只有2行匹配加入標準以及附加加入標準

另一個問題:左連接上的AND T1.Month = T2.Month條件是多餘的,因爲複合GOD鍵需要注意它的明確。

Results of the Left Join

2

當您加入表一起,你基本上要求數據庫的數據來自兩個不同的表作爲一個記錄相結合並顯示它。當您執行left join,你說:

給我所有從表1的行,以及來自 表2任何相關的數據(如果存在的話)。

在這個意義上,表2從數據不代表單獨附加記錄到Table 1(即使它們是在單獨的表存儲爲單獨的記錄)時,它表示相關聯數據。您正在鏈接表格之間的數據,而不是從每個表格附加行。

想象一下,表1存儲了人員,表2存儲了電話號碼。

  Table1       Table2 
+------+-------+--------+   +------+-------+-------------+ 
| Year | Month | Person |   | Year | Month | Phone  | 
+------+-------+--------+   +------+-------+-------------+ 
| 2017 | 12 | Bob |   | 2017 | 12 | 555-123-4567| 
| 2016 | 01 | Frank |   | 2016 | 01 | 555-234-5678| 
+------+-------+-------+   +------+-------+--------------+ 

您可以將它們加入到一起以獲取人員及其相應電話號碼的列表。但是你不希望從每個表中獲得行的組合(兩行人和兩行電話號碼)。

0

cross join通過組合每個參數中的一行來返回每一行。 (innerjoin on返回滿足條件的行cross join。即(innerjoin on返回每行可以使每個參數組合一行,並滿足其條件。

left join on返回從(innerjoin on行,再加上你可以通過null對右邊的參數列延長未連接左參數行讓行。

注意,這是,無論主鍵,唯一列集,外鍵或任何其他約束

這裏在每個參數中有2行,所以在cross join中有2 X 2 = 4行。但只有2個符合條件 - 一行與自身結合的條件。

(如果你left join是一個表格,它自身的條件是一列或多列左右版本的平等關係,並且在這些列中沒有null s,那麼每個左邊的參數行都會與at因此只有(innerjoin on的行被返回。)