0

我有 2 张桌子(请参阅http://sqlfiddle.com/#!3/6d04f/20

我很难想象以下之间的区别:

select *
from TableA as a right outer join tableB as b on b.city1id = a.id

select *
from TableA as a right outer join tableB as b on b.city1id = a.id
left outer join tableB parent on parent.city2id = b.city1id

在 TableA 和 TableB 之间有一个右外连接,其结果再次与 TableB 左外连接。

运行这两个查询的结果是相同的,所以我不确定在这种情况下左外连接有什么影响。

从概念上讲,我不确定这里有什么区别。

4

2 回答 2

1

好的,我会在我写的时候解释。

查询 2

 select *
    from TableA as a right outer join tableB as b on b.city1id = a.id
    left outer join tableB parent on parent.city2id = b.city1id

您可以像这样重写该查询

select *
from Tableb as b left outer join tablea as a on b.city1id = a.id
left  outer join tableb parent on parent.city2id = b.city1id

tableB 和 table A 之间的第一个左外连接执行此操作

TableB( get all records ) and tableA matching records = call this result set as T

T 和 tableb 之间的第二个左外连接执行此操作

T ( get all records ) and tableb matching records

看这里

查询 1

select *
from TableA as a right outer join tableB as b on b.city1id = a.id

可以这样写

select *
from Tableb as b left outer join tablea as a on b.city1id = a.id

它只是这样做

tableB 和 table A 之间的第一个左外连接(在上一个查询中解释)

 TableB( get all records ) and tableA matching records 
于 2013-04-28T21:42:48.223 回答
0

这里真正的问题是:你的目标是什么。外连接只是意味着提到的一侧(左侧或右侧)是要从中提取记录的一侧,然后另一侧将拉取匹配的记录,如果没有找到这样的匹配项,则返回 null。

既然你有A right B left (B as parent),两个连接都将从中提取记录,B并且表A只会根据需要提取匹配项或 null。因此,您的核心查询是所有 table BA在您进行匹配时将 table 拉入,最后B as parent在找到匹配项时将其拉入。

因此,这两个查询都将拉表B作为响应的核心,并且表B控制返回的行数:B 的所有行。在你的小提琴中,那是 7 行。

(外连接可能返回比主表更多的行(因为可选端的多个记录匹配单个必需的端记录),但绝不会少于所需的表)。

于 2013-04-28T21:10:12.330 回答