MSSQL 基础之Outer Join 误区

浏览: 2566

引言

T-SQL查询中一个非常重要的知识点就是多表连接查询。其中outer join对数据的处理特别的有意思,很多人对此的理想也存在着一些误区。关于误区1我一直是知道的,而误区2却是在近期的课程分享中发现的。做一个快乐的分享者,分享的过程亦是不断自我完善的过程。

认为左连接(left join)的结果集记录数等于左表记录数的同学请看误区一。

认为下图结果记录数为1或2的同学请看误区二。


误区1:结果集记录数等于保留表记录总数

说到误区1还有这样一段真实的小故事,一天一个同事QQ问我:


结果有此引发了一场“血案”:一直理解客户的业务是数据1对1,所以整个UI包括业务逻辑都是按1对1来处理的。结果悲剧就此产生了,据说为此多付出了半个月的时间来调整。

左连接的本质:左表(保留表)和右表先做笛卡尔值,然后执行On条件来过滤数据,然后保留左表被On过滤掉的数据。所以数据在1对多的情况下,总记录数是会多于左表的,但一定不会少于左表。


误区2:On条件对Join结果集的过滤

说到误区2,我一直以为left join...on 和 join...on的原理是一样的。直到在分享的时候对SQL执行顺序产生了疑惑才发现这个问题。引言中的T-SQL执行结果记录数为3,让我大跌眼镜。抱着疑问的精神又反复读了几遍SQL SERVER技术内幕之T-SQL查询关于SQL执行顺序的描述,渐渐的开始理解外连接的本质(如上所说)。


有人对这个结果仍有疑问的话,可以回复或者加群详聊。最好是自己能理解下……

推荐 2
本文由 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

5 个评论

感谢悟的分享, 对outer join的操作时要学习一下,和普通的认知有点差距的。
悟

回复 seng

嗯 我也是近期录制视频才学习到的
误区一很容易理解,误区二初看起来有点诡异。

误区二的结果有什么实际意义吗?好像看不到啊

个人认为将and 修改为where的实际意义更大些
悟

回复 choc

主要是理解下左连接的概念
choc

choc 回复

嗯,确实通过这2个例子有了更深刻的理解。

左连接的本质:左表(保留表)和右表先做笛卡尔值,然后执行On条件来过滤数据,然后保留左表被On过滤掉的数据。所以数据在1对多的情况下,总记录数是会多于左表的,但一定不会少于左表。

感谢分享,很好!

要回复文章请先登录注册