2013-04-08 37 views
1

我想知道什麼是多個邏輯連接(例如下面)使用多個連接(例如,左聯接)

SELECT * FROM B返回100行

SELECT B.* FROM B LEFT JOIN C ON B.ID = C.ID返回120行

據我所知如果兩個表都找到數據,則使用左連接將返回左表中的任何匹配數據,即B。但是如何在使用left join時返回比表B更多的數據呢?

我在這裏做錯了什麼或被誤解?任何指導都非常感激。提前致謝。

回答

1

讓是表B:

id 
---- 
1 
2 
3 

讓是表C中

id  name 
------------ 
1  John 
2  Mary 
2  Anne 
3  Stef 

b中的任何id都與c中的id匹配,那麼id = 2會匹配兩次。所以即使基表B有3行,左連接ID也會返回4行。

現在來看更惡例如:

表B

id 
---- 
1 
2 
2 
3 
4 

表C中

id  name 
------------ 
1  John 
2  Mary 
2  Anne 
3  Stef 

從步驟b中的每個ID與從C IDS匹配,則第一ID = 2將匹配兩次,第二個id = 2將匹配兩次,所以結果爲

select b.id, c.name 
from b left join c on (b.id = c.id) 

id  name 
------------ 
1  John 
2  Mary 
2  Mary 
2  Anne 
2  Anne 
3  Stef 
4  (null) 

的ID = 4是不匹配的,但因爲是左連接出現的結果。

+0

我可以知道你如何格式化你的查詢結果嗎?謝謝 – 2013-04-09 02:29:18

+0

你正在談論格式化Stack Overflow上的文本?當您處於編輯模式時,您有一個按鈕。其效果是用4或5個空格縮進行,結果是_code style_格式。 – 2013-04-09 05:17:13

+0

嗨再次,所以我使用DISTINCT消除從C中檢索到的重複數據,然後我的查詢輸出將只是從B數據的權利? – 2013-04-15 01:31:20

1

請看下面的例子:

B = {1,2} 
C = {(1,a),(1,b),(1,c),(1,d),(1,e)} 

B left join C結果將是:

1 | a 
1 | b 
1 | c 
1 | d 
1 | e 
2 | null 

結果中的行的數目是肯定比在乙行的情況下(2)。

一般在B left join C結果行的數量由B.size + C.size界,而不是僅由B.size像你想的......

0

根據您的查詢,它做與B和B表的連接表是左表,因此它將顯示左表的所有記錄在我們的情況下它是B和相關的其他表在我們的情況下它是C 。