在左连接上混淆(简单场景)

时间:2014-11-08 15:32:29

标签: sql join left-join

我理解内连接但是当涉及外连接时我很困惑。 表1有两行,如下所示:

tbl1:
1
1

表2有两行,如下所示:

tbl2:
1
2

内部联接:2行(据我所知,tbl1中的2行与tbl2中的值匹配) 左外连接:它将是3行(全部在tbl1上并且在两个表之间是通用的)

2 个答案:

答案 0 :(得分:1)

以下是使用SQLite的示例:

sqlite> create table tbl1(value int);
sqlite> insert into tbl1 values(1);
sqlite> insert into tbl1 values(1);
sqlite> create table tbl2(value int);
sqlite> insert into tbl2 values(1);
sqlite> insert into tbl2 values(2);

如果tbl2已加入tbl1,则会得到两个结果:

sqlite> SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.value = tbl2.value;
1|1
1|1

这是因为tbl1是“左”表,因此tbl1中的每一行都会被包含在内,无论它是否与tbl2匹配。

如果tbl1tbl2保持联系,您将得到三个结果:

sqlite> SELECT * FROM tbl2 LEFT JOIN tbl1 ON tbl1.value = tbl2.value;
1|1
1|1
2|

这是因为:

  • tbl2中的每一行都会被包含在内,无论tbl1
  • 中是否匹配
  • tbl2中的行可能会匹配tbl1中的多行。

在这种情况下,tbl2有两行匹配tbl1加一行没有匹配,总共产生三行。

答案 1 :(得分:0)

当LEFT OUTER JOIN右侧的表或结果集具有匹配值时,OUTER和INNER JOIN之间没有区别。这是你的例子中的情况 - 你得到两行 SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number

tbl1.number  tbl2.number
1            1
1            1

但是使用SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number得到相同的结果。

区别在LEFT OUTER JOIN的左侧 - 你说我想要tbl1中的所有行,而不管tbl2中是否有匹配的行。

因此,如果您使用tbl2DELETE FROM tbl2 WHERE number = 1删除第一行并使用INNER JOIN SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number运行命令 - 您将得到0条记录,因为{{1}中没有匹配的记录}。

如果你然后运行tbl2,你会得到:

SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number