与多次加入同一个表的结果相混淆

时间:2013-04-28 21:00:41

标签: sql-server join

我有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外连接。

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

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

2 个答案:

答案 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

see here

查询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行。

(外部联接可以返回更多行而不是主表(因为可选端上的多个记录匹配单个所需的侧记录),但绝不会少于所需的表)