1

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

SELECT * FROM B返回 100 行

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

据我所知,如果为两个表都找到了数据,则使用左连接将从左表返回任何匹配的数据,即 B。但是为什么在使用时left join,它返回的数据比表 B 本身还多?

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

4

3 回答 3

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您认为的......

于 2013-04-08T06:24:17.990 回答
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 不匹配但出现在结果中,因为它是左连接。

于 2013-04-08T06:24:56.630 回答
0

根据您的查询,它使用 C 和 B 表连接到 B 表是左表,因此它将显示左表的所有记录,在我们的案例中它是 B,并且在我们的案例中与其他表相关,它是 C。

于 2013-04-08T06:28:13.503 回答