最近遇到一个业务问题:
首先看表一 模板表 (A)简化版
id | 主键 |
template_name | 模板名称 |
表二 员工与模板表关联(B) 简化版
emp_code | 员工编码 |
template_id | 模板id |
然后我们来看一下表中数据
(表A)
(表B)
主要需求 用一个SQL返回 某个员工已经配置的坐班模板和未配置的坐班模板列表(用标识为0,1来区分已选和未选),按以上数据实际展示:
首先我用了一下SQL,empCode=100103
select
A.id,
A.template_name,
case when B.emp_code is null then 0 else 1 end isuse
from
A
left join B on A.id = B.template_id
where B.emp_code=?
返回的结果
实际上我需要传递给前端的是6条数据,问题出在哪里?经过一番思考,我的SQL语句改成下面这样:
select
A.id,
A.template_name,
case when B.emp_code is null then 0 else 1 end isuse
from
A
left join B on A.id = B.template_id and B.emp_code=?
返回的结果如下,这样前端才能展示如原型图那样
原因出在哪里?
我们知道left join是以左表为主返回该表所有记录,导致查询结果不同主要原因如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。