SELECT *
FROM t1
LEFT JOIN t2 ON t1.fk = t2.id;
它将总是返回与t1相同的行计数吗?
答案 0 :(得分:2)
左联接的契约规定,如果没有WHERE
子句可能会从结果集中删除记录,则出现在联接左侧的所有记录将至少出现一次。考虑以下数据集:
t1
id | fk
1 | 1
2 | 2
t2
id | value
1 | 1
1 | 2
您的查询将返回此结果集:
id | fk | id | value
1 | 1 | 1 | 1
1 | 1 | 1 | 2
2 | 2 | NULL | NULL
请注意,第一个表的fk = 2
与第二个表没有任何匹配。该记录仍显示在结果集中,但来自第二个表的所有列均为NULL
。另外,请注意,fk = 1
记录出现两次,因为第一张表中的单个记录与第二张表中的记录匹配两次。
答案 1 :(得分:2)
如果t2.id
具有唯一约束,则行数将始终与没有联接的行数相同。如果不是唯一的,则将获得同一t1
行的多个重复项,每个重复项都有其自己的对应的t2
行。对于您来说是否足够好取决于您的数据库设计。
答案 2 :(得分:1)
不一定:
CREATE TABLE t1(id int, fk int);
INSERT INTO t1 VALUES (1,1);
CREATE TABLE t2(id int, value int);
INSERT INTO t2 VALUES(1,1),(1,2);
SELECT *
FROM t1
LEFT JOIN t2 ON t1.fk = t2.id;
返回2行:
id fk id value
1 1 1 1
1 1 1 2
答案 3 :(得分:1)
它将总是返回与t1相同的行计数吗?
否。
LEFT JOIN
是一个联接,因此将一个表的一行与另一表的多行匹配。结果集可能具有相同的行数或更多的行。