sql中:on和where的使用区别

工作中遇到一个问题:

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是空的->将该信息删除
后者是:
查询员工时,将员工表的版本加入-> 发现是空的,没关系,主表信息还在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值