27

鉴于以下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。

它是如何工作的?

4

1 回答 1

51

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 在这里很好地解释了逻辑查询处理

于 2012-09-29T20:04:16.940 回答