Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要了解多个联接(左外部联接、右外部联接、完全外部联接)如何在单个SQL查询中工作_Sql_Join - Fatal编程技术网

需要了解多个联接(左外部联接、右外部联接、完全外部联接)如何在单个SQL查询中工作

需要了解多个联接(左外部联接、右外部联接、完全外部联接)如何在单个SQL查询中工作,sql,join,Sql,Join,我有四个表-A、B、C、D。每个表有一列:ID 数据: 我需要帮助了解此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; 在左连接之前,我非常清楚,但在左连接之后,当应用后续连接时,我不理解结果如何变化。将其想象为SQL堆栈机器。在FROM子句中遇到表时,从左到右将

我有四个表-A、B、C、D。每个表有一列:
ID

数据:

我需要帮助了解此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;

在左连接之前,我非常清楚,但在左连接之后,当应用后续连接时,我不理解结果如何变化。

将其想象为SQL堆栈机器。在FROM子句中遇到表时,从左到右将它们推到堆栈上,并在遇到on子句时对最上面的两个表执行联接。每个连接的结果在生成时也会推送到堆栈上。

根据@Pieter的回答,我们可以系统地完成以下工作:

仅使用第一个左连接:

SELECT D.ID AS D, c.ID AS C
from d 
    left join c 
        on d.id = c.id 
返回所有Ds行。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
最后,返回到A的
完全外部联接
将从
联接
的任一侧添加缺少的行

这意味着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

谢谢斯图尔特的回复。感谢Pieter对结果的详细解释。这澄清了我的疑虑。
D       C       B    A
NULL    NULL    1    1
NULL    NULL    2    2
NULL    NULL    4    4
5       5       5    NULL
NULL    NULL    NULL 3