繁体   English   中英

需要了解多个连接 - 左外,右外,全外连接如何在单个SQL查询中工作

[英]Need to understand how Multiple joins - Left Outer, Right outer, Full outer joins work in a single SQL Query

我有四张桌子 - A,B,C,D。 每个表有1列: ID

数据:

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;

我很清楚直到左连接,但在那之后应用后续连接时,我不明白结果是如何变化的。

根据@ Pieter的回答,我们可以通过以下方式系统地工作:

只需要第一个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 

返回所有Bs行,其中C和D都为NULL,其中连接失败。 D,C和B只有5个共同。

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

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

这意味着B中不存在的A中的'3'被添加回来,其他列的NULL为

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

想象一下它是一个SQL 堆栈机器 在FROM子句中从左到右遇到表时将表推送到堆栈,并在遇到ON子句时对两个最顶层的表执行连接。 每个连接的结果也会在生成时被压入堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM