2013-04-08 36 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 。