2014-11-08 109 views
1

我理解內連接,但當涉及到外連接時我感到困惑。困惑於左連接(簡單場景)

tbl2: 
1 
2 

內連接:2行(I明白,2排在tbl1與一個匹配 表1具有兩列如下所示:如下所示

tbl1: 
1 
1 

表2具有兩排在tbl2) 左外值加入:會是3行(所有在tbl1和兩個表之間共用)

+0

請更好地解釋你的例子。使用列名稱和值,以便具有相同疑問的其他用戶可以理解您的問題。同樣爲了您得到正確的答案,您需要提出正確的問題。 – antorqs 2014-11-08 15:45:27

+0

你應該改進和澄清你的例子,但它看起來像你的例子,你會得到與內部連接相同的結果。 – grin0048 2014-11-08 15:47:12

+0

這是我面試問題的一部分,我在上面給出了兩個表格,並被要求解釋我將作爲所有類型連接的輸出獲得的行數。 – Deepthi 2014-11-08 16:00:02

回答

0

當在左外右側的表或結果集JOIN已經然後匹配的值OUTER和INNER JOIN之間沒有區別。它是在你的榜樣的情況 - 你得到兩行 爲SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number

tbl1.number tbl2.number 
1   1 
1   1 

但是你使用SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number相同的結果。

不同之處在左外連接的左側 - 你說我想要tbl1中的所有行,而不管tbl2中是否有匹配的行。

所以,如果你tbl2DELETE FROM tbl2 WHERE number = 1刪除第一行並運行內蒙古命令JOIN SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number - 你得到0記錄,因爲沒有匹配的記錄tbl2

如果你再運行SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number,您可以:

tbl1.number tbl2.number 
1   NULL 
1   NULL 
+0

感謝您花時間回覆,清除了我所困惑的內容。 – Deepthi 2014-11-08 16:12:04

1

下面是一個例子使用SQLite:

sqlite> create table tbl1(value int); 
sqlite> insert into tbl1 values(1); 
sqlite> insert into tbl1 values(1); 
sqlite> create table tbl2(value int); 
sqlite> insert into tbl2 values(1); 
sqlite> insert into tbl2 values(2); 

如果tbl2被上tbl1左加入,你會得到兩個結果:

sqlite> SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.value = tbl2.value; 
1|1 
1|1 

這是因爲tbl1是「左」表,因此將包括來自tbl1的每一行,無論它是否在tbl2中匹配。到tbl2

如果tbl1是左加入,你會得到三種結果:

sqlite> SELECT * FROM tbl2 LEFT JOIN tbl1 ON tbl1.value = tbl2.value; 
1|1 
1|1 
2| 

這是因爲:

  • tbl2每一行都將包括,是否存在是tbl1的匹配
  • tbl2中的行可能與tbl1中的多行匹配。

在這種情況下,tbl2有兩行用火柴在tbl1加一行不匹配,從而導致三個總。

+0

感謝您花時間回覆,這有助於理解這一概念。 – Deepthi 2014-11-08 16:15:09