在Craig Freedman的博客Nested Loops Join中,他解释了为什么嵌套循环联接不能支持正确的外部联接:
问题在于,我们多次扫描内部表–对外部联接的每一行扫描一次。在这些多次扫描中,我们可能多次遇到相同的内部行。在什么时候我们可以得出结论,特定的内部行尚未或将不会加入?
有人可以用一种非常简单且具有教育意义的方式来解释这一点吗?
这是否意味着循环从外部表(R1
)开始并扫描内部表(R2
)?
我了解,对于R1
不与相连的值,R2
应将其替换为,NULL
这样结果集将变为(NULL, R2
)。对我来说,似乎无法返回不加入R2
时返回值R1
,因为它不知道R2
要返回哪个值。但这不是它的解释方式。还是?
SQL Server会在事实上优化(经常替换)RIGHT JOIN
用LEFT JOIN
,但问题是解释为什么它在技术上是不可能的NESTED LOOPS JOIN
使用/支持RIGHT JOIN
逻辑。