Alw*_*wyn 24 sql t-sql sql-server join left-join
鉴于以下3种方式加入
select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk
Run Code Online (Sandbox Code Playgroud)
如果t2和t3之间的连接失败,那么是否会返回t1和t2之间成功连接的行?如果操作顺序从左到右,我假设没有,但是如果它从右到左进行评估(t3首先连接到t2),那么即使前者失败,t1仍然会被返回.
它是如何工作的?
Mar*_*ith 44
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在这里解释了逻辑查询处理