我有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外连接。
运行两个查询的结果是一样的,所以我不确定左外连接在这种情况下有什么影响。
从概念上讲,我不确定这里的区别是什么。
答案 0 :(得分:1)
好的,我会解释as i wrote that。
查询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和表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和表A之间的第一个左外连接(在上一个查询中解释)
TableB( get all records ) and tableA matching records
答案 1 :(得分:0)
这里真正的问题是:你的目标是什么。外部连接仅表示所提到的一侧(左侧或右侧)是将从中拉出记录的一侧,然后相反侧将拉出匹配记录,如果未找到此类匹配则为null。
由于您有A right B left (B as parent)
,因此两个联接都将从B
中提取记录,而表A
只会根据需要提取匹配项或空值。因此,您的核心查询全部是表格B
,在您进行匹配时会将表格A
拉入,最后在匹配项中将B as parent
拉入。
因此,两个查询都将拉表B
作为响应的核心,而表B
控制返回的行数:B的所有行。在你的小提琴中,这是7行。
(外部联接可以返回更多行而不是主表(因为可选端上的多个记录匹配单个所需的侧记录),但绝不会少于所需的表)