使用多个连接(例如左连接)

时间:2013-04-08 06:11:37

标签: sql oracle

我想知道多连接的逻辑是什么(例如下面的)

SELECT * FROM B返回100行

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

据我所知,如果找到两个表的数据,使用左连接将返回左表中的任何匹配数据,即B。但是,当使用left join时,它返回的数据多于表B本身?

我在这里做错了什么或被误解了?任何指导都非常感谢。提前谢谢。

3 个答案:

答案 0 :(得分: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

结果中的行数肯定大于B(2)中的行数。

一般情况下,B left join C的结果中的行数受B.size + C.size的限制,而不仅仅是B.size ... {/ p>

答案 1 :(得分: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的id匹配,然后第一个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不匹配但出现在结果中,因为是左连接。

答案 2 :(得分:0)

根据你的查询,它连接到B表,C和B表是左表,所以它将显示左表的所有记录,在我们的情况下,它是B,并且与我们案例中的其他表相关,它是C.