有三种关系(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 :(得分: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
加入,因为它们会“隐藏”有关查询正在执行的操作的信息,并且很容易导致出现错误/意外结果。
答案 1 :(得分: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
因为您必须指定必须连接哪个列。