2014-01-26 102 views
2

有三種關係(T1,T2,T3):自然全外連接?

t1 
----------- 
a | b 

1 | 2 
----------- 

t2 
------------ 
    b | c 

    2 | 3 
------------ 

t3 
------------- 
    a | c 

    4 | 5 
------------- 

查詢是:

select * from t1 natural full outer join (t2 natural full outer join t3); 

select * from t2 natural full outer join t3結果是:

----------------- 
    a | b | c 

    | 2 | 3 

    4 |  | 5 
------------------ 

然後我想:

select * from t1 natural full outer join (result)

t1    result 
-----------  ----------------- 
a | b   a | b | c 

1 | 2    | 2 | 3 

        4 |  | 5 
       ------------------ 

不應該是這樣:

-------------------------- 
    a | b | c 

    1 | 2 | 3 

    4  |  | 5 

但我不知道爲什麼SQL查詢得出:

a | b | c 

4 | | 5 
    | 2 | 3 
1 | 2 | 
+0

我刪除了MySQL標籤,因爲它不支持完整的外連接。 –

+0

完全外連接在mysql中不存在。如果你想模擬它,看看這篇文章:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – Grumpy

回答

1

您的疑問:

select * 
from t1 natural full outer join 
    result 

是等價到:

select * 
from t1 full outer join 
    result 
    on t1.a = result.a and t1.b = result.b; 

natural加入看看全部該領域的共同點,而不僅僅是一個。沒有匹配的行,這就是爲什麼你得到三行結果。

你似乎想:​​

select * 
from t1 full outer join 
    result 
    on t1.b = result.b; 

在一般情況下,最好是避免natural加入的,因爲他們「隱瞞」什麼的查詢正在進行信息,並且可以很容易導致錯誤的/出乎意料的結果,當您有經驗的。

0

我不知道你是否知道FULL OUTER JOIN是如何工作的。

FULL OUTER JOIN結合了左外連接和右外連接的結果,並且返回連接子句兩邊表中的所有(匹配或不匹配)行。

所以,如果你想這樣的結果:

-------------------------- 
    a | b | c 

    1 | 2 | 3 

    4 |  | 5 

這些表:

t1    result 
-----------  ----------------- 
a | b   a | b | c 

1 | 2    | 2 | 3 

        4 |  | 5 

你應該這樣做查詢:

SELECT * FROM t1 natural RIGHT JOIN (result) res ON t1.b = res.b 

,因爲你必須與列指定必須加入。