需要了解多个联接(左外部联接、右外部联接、完全外部联接)如何在单个SQL查询中工作
我有四个表-A、B、C、D。每个表有一列:需要了解多个联接(左外部联接、右外部联接、完全外部联接)如何在单个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子句中遇到表时,从左到右将
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