JOIN如何在OUTER JOIN上分发?

时间:2015-02-06 15:21:46

标签: sql join

有没有这两个不相同的情况?

A OUTER JOIN (B JOIN C)
A OUTER JOIN C OUTER JOIN B

4 个答案:

答案 0 :(得分:0)

是:

在你的第一个例子(A OUTERJOIN (B JOIN C))中,如果B或C没有匹配的记录,则B和C都被省略。

在你的第二个例子(A OUTERJOIN C OUTERJOIN B)中,即使B没有匹配的记录,也可以返回C.

答案 1 :(得分:0)

仍然与我的评论相同。如果B join C产生一个空结果集,则A外连接"空结果集"和A一样。

外连接B外连接C是不同的(至少如果B和C中的一个不是空的话。)

答案 2 :(得分:0)

由于A似乎连接到C,因此将第一个选项写为:

会更清楚
A OUTERJOIN (C JOIN B)

两个选项之间的关键区别在于,当A和C之间存在匹配时,是否返回来自C的数据。只是看这个方面,这两个选项可以被视为集合:

intersect(A,intersect(C,B))
intersect(A,C)

显然,两者是不同的,因为第一种形式可以在与A相交之前消除C中的行。

答案 3 :(得分:0)

您加入的哪些字段可以产生影响,因为不保证表格只有一个可能的字段可以加入另一个表格。在这种情况下,表b是否有一个字段可以连接到表c或表a?这有所不同。您想要返回的字段会对结果集产生影响,而其他两个字段将返回相同的结果。数据的状态有所不同,因为在数据更改之前,某些查询看起来是等效的。因此,他们认为这些不是等同的问题,可以帮助您避免这些错误。无论您使用完整,左侧还是右侧外部连接,都会产生影响。最后你添加的子句在哪些条款看起来是等价的时候会有所不同。

使用临时表(SQL服务器语法)

查看这些示例
create table #a (aid int, sometext varchar(50))
create table #b (bid int, sometext2 varchar(50), cid int, aid int)
create table #c (cid int, sometext3 varchar(50),  aid int)

insert into #a 
values(1, 'test') , (2, 'test2'), (3, 'test3')

insert into #b 
values(1, 'test', 1, 2) , (2, 'test2', 2, 1), (3, 'test3', 2, 2)

insert into #c 
values(1, 'test', 1) , (2, 'test2', 2), (3, 'test3', 1)


select * 
from  #a a
left outer join #c c  on a.aid = c.aid
left outer join #b b on a.aid = b.aid

select * 
from  #a a
left outer join #c  c on a.aid = c.aid
left outer join #b  b on c.cid = b.cid

select *
from #a a
left outer join #b b 
join #c c on b.cid = c.cid
on a.aid = b.aid

select * 
from  #a a
right outer join #c c  on a.aid = c.aid
right outer join #b b on a.aid = b.aid

select * 
from  #a a
right outer join #c  c on a.aid = c.aid
right outer join #b  b on c.cid = b.cid

select *
from #a a
right outer join #b b 
join #c c on b.cid = c.cid
on a.aid = b.aid

select * 
from  #a a
full outer join #c c  on a.aid = c.aid
full outer join #b b on a.aid = b.aid

select * 
from  #a a
full outer join #c  c on a.aid = c.aid
full outer join #b  b on c.cid = b.cid

select *
from #a a
full outer join #b b 
join #c c on b.cid = c.cid
on a.aid = b.aid