2015-04-04 67 views
2

我有四个表 - A,B,C,D。每个表有1列:ID需要了解如何多个连接 - 左外部,右外部,完全外部连接在单个SQL查询中工作

数据:

Table A = 1,2,3,4 
Table B = 1,2,4,5 
Table C = 2,3,4,5 
Table D = 1,3,5,7 

我需要帮助理解这个SQL查询的输出:

select d.*, c.*, b.*,a.* 
from d 
    left join c on d.id = c.id 
    right join b on b.id = c.id 
    full outer join a on a.id = b.id; 

我很清楚,直到左连接,但在此之后,当随后的连接被应用,我不明白结果如何变化。

回答

2

想象它作为一个SQL 堆栈机。在FROM子句中从左到右遇到将表推入堆栈,并在遇到ON子句时在两个最顶级的表上执行联接。每次连接的结果都会在生成时被压入堆栈。

3

按@彼得的回答中,我们可以系统地通过这项工作:

以只是第一个LEFT JOIN:

SELECT D.ID AS D, c.ID AS C 
from d 
    left join c 
     on d.id = c.id 

Ds的所有行返回。 NULLS存在失败的基于C加入:

D C 
1 NULL 
3 3 
5 5 
7 NULL 

然后,将正确的加入到B:

SELECT D.ID AS D, c.ID AS C, b.ID AS B 
from d 
    left join c 
     on d.id = c.id 
    right join b 
     on b.id = c.id 

所有烧烤行返回,用C和d是空在那里加入失败。 只有5是共同的d,C和B.

D  C  B 
NULL NULL 1 
NULL NULL 2 
NULL NULL 4 
5  5  5 

最后,FULL OUTER JOIN回到A将从JOIN的任一侧添加缺少的行。

这意味着从B A不存在于“3”加回,与空值的其他列

D  C  B A 
NULL NULL 1 1 
NULL NULL 2 2 
NULL NULL 4 4 
5  5  5 NULL 
NULL NULL NULL 3 
+0

感谢斯图尔特您的响应。感谢Pieter的详细解释和结果。它澄清了我的疑惑。 – Chetan 2015-04-05 13:55:58