当我是新手时SQL
,我做了一些真正激烈的思考understand how SQL joins work
。在某个时刻,我意识到,多年以来prior experience with -or say, exposure to, MS Excel's
vlookup
,我的想法和理解是错误的。虽然网上有很多很好的参考资料,但我没有得到。Venn diagrams
起初也没有帮助我。我发布了这个问题,希望其他人不会像我一样陷入同样的心理陷阱。我也会给出答案。当然也非常欢迎其他建议。虽然我花了一些时间来写这篇文章,但如果我不发布这个我就无法忍受自己......
1 回答
当我开始使用 SQL 和联接时,我只是不明白为什么,例如,SQL 的左联接给我的结果比我在进行 vlookup 时所期望的要多。维恩图对我没有帮助,尽管我现在发现它们非常清晰。
经过一周真正激烈的激烈思考后,我突然意识到我之前的经历已经成为了我的典范:在basic formula of vlookup
, only one result is given back
. 在basic expression of a left join
, zero or more results are given back
.
我会尽力澄清。例如,我在 Excel 工作表中有下面的数据和公式(在 D 列中)。列标题在第一行,所以这就是公式说明 A2 等的原因。为了简单起见,我在 B 和 C 附近的 A 列中有数据,实际上最好将它放在其他地方,因为你可以将数据集解释为每行都是记录的表。在本例中并非如此。换句话说:单元格 A3 (2) 与 B3 到 C3 (1, Blue) 的记录不同。对于那些阅读本文的人,我假设他们理解公式以及“错误”子句,否则从这里开始。
A B C D (result in D)
1 1 Green =vlookup(A2,B:C;2;false) (result=Green)
2 1 Blue =vlookup(A3,B:C;2;false) (result=Orange)
3 2 Orange =vlookup(A4,B:C;2;false) (result=Yellow)
4 3 Yellow =vlookup(A5,B:C;2;false) (result=#n/a)
在 D2 列中,您会看到结果只给出了“绿色”。加入会返回“绿色”和“蓝色”。
请参阅下面的 SQL 查询(方言是 t-sql)和结果。
select A as AFromTableA
,B as BFromTableBC
,C as CFromTableBC
from tableBC left outer join tableA
on B=A;
结果:
AFromTableA BFromTableBC CFromTableBC
1 1 Green
1 1 Blue
2 2 Orange
3 3 Yellow
您会看到绿色和蓝色都在结果中返回。那是因为 join 搜索所有结果。还要看到 B=4 没有返回,那是因为它是从 TableBC 开始的左连接。如果它从表 A 开始,实际上表中是 4,则返回空结果。像这样:
AFromTableA BFromTableBC CFromTableBC
1 1 Green
1 1 Blue
2 2 Orange
3 3 Yellow
4 NULL NULL
以下是一些自己编写的脚本:
create table tableA (A int)
create table tableBC (B int, C nvarchar(10))
insert into tableA
values (1),(2),(3),(4);
insert into tableBC (B,C)
values (1, 'Green')
,(1, 'Blue')
,(2,'Orange')
,(3, 'Yellow');
所以,希望这个答案能帮助你思考。现在阅读一些关于连接的更多澄清信息: