工作中遇到一个问题:
select d.*
l.empl_id,
from D d
LEFT JOIN L l on d.empl_id = l.id and d.x=l.x
where d.id = 00002
and d.version = 20210823
and l.version = 20210823
背景: d表是一个机构表,l表是一个员工表,
d中的empl_id记录了相关机构的负责员工(00003)
d与l的id是机构号码与员工号码
x是一个业务条件,可忽略
上面sql中d.empl_id是空的,但是对应的l中是存在相关的记录的
问题:以上结果得出的结果是空?
我原先以为是其他我删掉的延展部分写错了,但是这个问题明显是一个逻辑问题,于是我怀疑是漏掉了什么on与where的其他
于是我查询了相关的on与where的区别,这里就不粘了,一堆的
主要就是说:二者都表示条件,但是on表示的是链接的附表的筛选条件,而where表示的是整体筛选条件
于是我将l.version去掉,结果出来了,与预期一样
那就说明在前置条件结果值的基础之上,他针对结果集又进行了一次筛选。把原先正确的结果值筛选掉了,虽然他是一个附表的选择条件。。。
于是我改为
select d.*
l.empl_id,
from D d
LEFT JOIN L l on d.empl_id = l.id and d.x=l.x and l.version = 20210823
where d.id = 00002
and d.version = 20210823
就对了,运行的过程
前者是:
先查出前置条件符合的信息->查询l.version = 20210823->发现d.empl_id = l.id是空的->将该信息删除
后者是:
查询员工时,将员工表的版本加入-> 发现是空的,没关系,主表信息还在