上篇文章给大家处理一个小测试,未参与或者忘了题目内容的可以点击链接看下。
这个题目的正确答案为B,下面是大家选择结果,准确率为36%,说明大家还是忽略了一些基础知识的细节的。

我们可以看到,选择集中在B和C,差别点在结果是否包含“1,null”该行。
第一点:大家都能够确定的是t2.id肯定是NULL,说明大家对于on条件中的t1.id = 2 的关联条件,可以限制t2表的结果;
第二点:left join 中的on条件是关联条件,不限定左表数据,所以t1表中的所有数据都需要保留;
第三点:在真实需求下,期望得出C的结果是错写出该SQL,产出C结果的SQL如下:
selectt1.id,t2.idfrom t1left join t2on t1.id = t2.idwhere t1.id =2;
1.首先这个题目的SQL写法不是很常见,为了考察对应知识点特意在on条件中限定左表;
2.通常在做关联时,都是对原始表进行行列裁剪之后再进行关联,这样既可以减少关联计算涉及的数据量,也减少逻辑的复杂度,可读性更好.如果业务逻辑复杂上面的SQL出错的可能性还是比较高的,所以我通常的写法如下:
selectnew_t1.id,new_t2.idfrom(selectidfrom t1where t1.id=2) new_t1left join(selectidfrom t2)new_t2on new_t1.id = new_t2.id
3.群里的朋友也给出使用CETs的写法,在逻辑复杂的情况下会更加清晰,同样的也是先做行的裁剪。
with new_t1 as(selectidfrom t1where t1.id=2),new_t2 as(selectidfrom t2)selectnew_t1.id,new_t2.idfrom new_t1left joinnew_t2on new_t1.id = new_t2.id
为了方便交流和得到大家的反馈,我创建了一个交流群,欢迎大家加入。(社群不卖课,不开星球,只交流)


原文作者:数据仓库技术;如有侵权,请联系管理员删除。