我有四张桌子 - 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;
我很清楚,直到左连接,但之后应用后续连接时,我不明白结果是如何变化的。
答案 0 :(得分:6)
根据@ 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
答案 1 :(得分:3)
想象一下它是一个SQL 堆栈计算机。在FROM子句中从左到右遇到表时将表推送到堆栈,并在遇到ON子句时对两个最顶层的表执行连接。每个连接的结果也会在生成时被压入堆栈。