天然全外连接?

时间:2014-01-26 12:36:02

标签: sql sql-server join

有三种关系(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 | 

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

因为您必须指定必须连接哪个列。