鉴于以下3种方式加入
select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk
如果 t2 和 t3 之间的连接失败,是否会返回 t1 和 t2 之间连接成功的行?如果操作顺序是从左到右,我假设不是,但是如果它是从右到左评估的(t3 首先连接到 t2),那么即使前者失败,仍然会返回 t1。
它是如何工作的?
鉴于以下3种方式加入
select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk
如果 t2 和 t3 之间的连接失败,是否会返回 t1 和 t2 之间连接成功的行?如果操作顺序是从左到右,我假设不是,但是如果它是从右到左评估的(t3 首先连接到 t2),那么即使前者失败,仍然会返回 t1。
它是如何工作的?
ON
子句的位置控制评估的逻辑顺序。
所以首先t1 LEFT JOIN t2 ON t1.fk = t2.pk
发生。此连接的结果是一个包含所有匹配行的虚拟表,t1, t2
并且(因为它是左外连接)任何不匹配t1
的行也将保留为t2
列的空值。
然后这个虚拟表参与下一个连接。JOIN t3 ON t2.fk = t3.pk
任何t2
不匹配行的记录都不t1
是第一阶段的虚拟表输出的一部分,因此不会出现在最终结果中。此外,这种内部连接t2.fk = t3.pk
将失去任何有效地将整个事物转回内部连接的NULL
价值。t2.fk
Itzik Ben Gan 在这里很好地解释了逻辑查询处理