当您的心理参考是 Excel 的 vlookup 时如何理解连接?
How to understand joins when your mental reference is Excel's vlookup?
当我刚接触 SQL
时,我对 understand how SQL joins work
进行了一些真正深入的思考。在某个时刻,我意识到多年的 prior experience with -or say, exposure to, MS Excel's
vlookup
,让我的思考和理解出现了错误的方式。虽然网上有很多好的参考资料,但我没有找到。 Venn diagrams
一开始也没有帮助我。我 post 这个问题希望其他人不会像我一样陷入同样的心理陷阱。我也会给出答案。当然也非常欢迎其他建议。虽然我花了一些时间来写这篇文章,但如果我不这样做,我就是无法忍受自己 post 这个...
当我从 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 sheet 中有下面的数据和公式(在 D 列中)。 headers 列在第一行,所以这就是为什么公式声明 A2 等。为了简单起见,我在 B 和 C 附近的 A 列中有数据,实际上最好将它放在某个地方否则,因为您可以将数据集解释为 table,其中每一行都是一条记录。在这个例子中不是这种情况。换句话说:单元格 A3 (2) 与 B3 到 C3(1,蓝色)不是同一记录。对于阅读本文的人,我假设他们理解公式和 'false' 子句,否则从 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 列中,您看到结果只给出了 'Green'。加入会返回 'Green' AND 'Blue'。
查看下面的 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不是return,那是因为它是从TableBC开始的left join。如果它从 TableA 开始,实际上 4 在 table 中,将返回一个空结果。像这样:
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');
所以,希望这个答案能帮助您思考。现在阅读一些关于联接的更多澄清信息:
当我刚接触 SQL
时,我对 understand how SQL joins work
进行了一些真正深入的思考。在某个时刻,我意识到多年的 prior experience with -or say, exposure to, MS Excel's
vlookup
,让我的思考和理解出现了错误的方式。虽然网上有很多好的参考资料,但我没有找到。 Venn diagrams
一开始也没有帮助我。我 post 这个问题希望其他人不会像我一样陷入同样的心理陷阱。我也会给出答案。当然也非常欢迎其他建议。虽然我花了一些时间来写这篇文章,但如果我不这样做,我就是无法忍受自己 post 这个...
当我从 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 sheet 中有下面的数据和公式(在 D 列中)。 headers 列在第一行,所以这就是为什么公式声明 A2 等。为了简单起见,我在 B 和 C 附近的 A 列中有数据,实际上最好将它放在某个地方否则,因为您可以将数据集解释为 table,其中每一行都是一条记录。在这个例子中不是这种情况。换句话说:单元格 A3 (2) 与 B3 到 C3(1,蓝色)不是同一记录。对于阅读本文的人,我假设他们理解公式和 'false' 子句,否则从 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 列中,您看到结果只给出了 'Green'。加入会返回 'Green' AND 'Blue'。
查看下面的 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不是return,那是因为它是从TableBC开始的left join。如果它从 TableA 开始,实际上 4 在 table 中,将返回一个空结果。像这样:
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');
所以,希望这个答案能帮助您思考。现在阅读一些关于联接的更多澄清信息: