有没有这两个不相同的情况?
A OUTER JOIN (B JOIN C)
A OUTER JOIN C OUTER JOIN B
答案 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