当我刚接触SQL
时,我对understand how SQL joins work
做了一些真正强烈的思考。在某个时刻,我意识到多年的prior experience with -or say, exposure to, MS Excel's
vlookup
,以错误的方式得到了我的思考和理解。虽然在网上有很多很好的参考,但它没有找到我。 Venn diagrams
一开始也没有帮助我。我发布这个问题,希望其他人不会像我一样陷入同样的心理陷阱。我也会给出答案。其他建议当然也非常受欢迎。虽然我花了一些时间来写这篇文章,但如果我没有发布这篇文章,我就无法忍受...
答案 0 :(得分:0)
当我开始使用SQL并加入时,我只是无法理解为什么,例如,SQL的左连接给了我比我预期的更多结果。维恩图没有帮助我,虽然我现在发现他们非常澄清。
经过一周真正强烈的激烈思考后,我突然意识到我之前的经历已经模范了我: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等的原因。为了简单起见,我将A列中的数据放在B和C附近,实际上将它放在其他地方会更好,因为你可以将数据集解释为每个行都是记录的表。在这个例子中并非如此。换句话说:单元格A3(2)与B3至C3(1,蓝色)的记录不同。对于那些阅读本文的人,我认为他们理解公式以及“假”条款,否则开始here。
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
您会看到结果中都会返回绿色和蓝色。这是因为联接搜索所有结果。还看到B = 4不返回,这是因为它是从TableBC开始的左连接。如果它从TableA开始,其中4表示事实上IS在表中,则返回null结果。像这样:
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');
所以,希望这个答案可以帮助你思考。现在阅读一些关于联接的更多澄清信息: