2014-01-26 73 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 

,因为你必须与列指定必须加入。