题目
上篇文章给大家处理一个小测试,未参与或者忘了题目内容的可以点击链接看下。
这个题目的正确答案为B,下面是大家选择结果,准确率为36%,说明大家还是忽略了一些基础知识的细节的。
我们可以看到,选择集中在B和C,差别点在结果是否包含“1,null”该行。
第一点:大家都能够确定的是t2.id肯定是NULL,说明大家对于on条件中的t1.id = 2 的关联条件,可以限制t2表的结果;
第二点:left join 中的on条件是关联条件,不限定左表数据,所以t1表中的所有数据都需要保留;
第三点:在真实需求下,期望得出C的结果是错写出该SQL,产出C结果的SQL如下:
代码语言:javascript复制select
t1.id,
t2.id
from t1
left join t2
on t1.id = t2.id
where t1.id =2;
附
1.首先这个题目的SQL写法不是很常见,为了考察对应知识点特意在on条件中限定左表;
2.通常在做关联时,都是对原始表进行行列裁剪之后再进行关联,这样既可以减少关联计算涉及的数据量,也减少逻辑的复杂度,可读性更好.如果业务逻辑复杂上面的SQL出错的可能性还是比较高的,所以我通常的写法如下:
代码语言:javascript复制select
new_t1.id,
new_t2.id
from
(
select
id
from t1
where t1.id=2
) new_t1
left join
(
select
id
from t2
)new_t2
on new_t1.id = new_t2.id
3.群里的朋友也给出使用CETs的写法,在逻辑复杂的情况下会更加清晰,同样的也是先做行的裁剪。
代码语言:javascript复制with new_t1 as
(
select
id
from t1
where t1.id=2
),
new_t2 as
(
select
id
from t2
)
select
new_t1.id,
new_t2.id
from new_t1
left join
new_t2
on new_t1.id = new_t2.id