2015-02-06 41 views
0

有沒有這兩種不相同的情況?JOIN如何通過OUTER JOIN分發?

A OUTER JOIN (B JOIN C) 
A OUTER JOIN C OUTER JOIN B 
+1

是這些例子。例如。如果b加入c沒有匹配。 – jarlh 2015-02-06 15:23:59

+0

@jarlh:糟糕,請參閱我的更新 – Eric 2015-02-06 15:26:45

+1

「outerjoin」不是SQL操作。有「左外連接」,「右外連接」和「完全外連接」。他們不一樣。 – 2015-02-06 15:57:07

回答

0

是:

在您的第一個例子(A OUTERJOIN (B JOIN C)),如果有一個B或C沒有匹配的記錄,B和C被省略。

在第二個示例(A OUTERJOIN C OUTERJOIN B)中,即使B沒有匹配記錄,也可以返回C.

0

與我的評論相同。如果B連接C產生空結果集,則外連接「空結果集」與A相同。

外連接B外連接C有些不同(至少如果B和C之一是。不爲空)

0

由於A似乎連接到C,這將是更清晰的寫第一個選項爲:

A OUTERJOIN (C JOIN B) 

兩個選擇之間的主要區別是從C數據是否返回時,有是A和C之間的匹配。僅僅看這個方面,兩個選項可以被看作集合:

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

顯然,兩者是不同的,因爲第一種形式可以消除由C行之前,它與A.相交

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