mysql在LEFT JOIN中使用多个条件,发现查询结果个数有问题

今天在导数据的过程中发现,在LEFT JOIN的过程中,多个匹配条件的结果个数不对。

比如有三张表A, B, C,在A left join B leftjoin C的过程中,总的数量应该与表A个数相同,但是当有多个匹配条件时,发现结果的个数不对,经过排查,原来原因出在where上。

开始写的语句类似于:

SELECT * FROM A 
LEFT JOIN B ON A.field1 = B.field1
LEFT JOIN C ON A.field2 = C.field2 AND B.field3 = C.field3 WHERE C.field4 > 1;

结果比A的行数少。

 

原因在与,sql在执行LEFT JOIN的时候会先整体处理ON后面的条件进行拼接,之后在处理WHERE后面的条件进行筛选,而两者的执行方式是不一样的,ON在右表匹配不到时,会添加一个NULL,而WHERE在匹配不到时会过滤掉该行,造成结果比预想的少。

一个处理方式是,根据ON和WHERE的处理逻辑谨慎选择两者,比如上面的例子其实可以写成:

SELECT * FROM A

LEFT JOIN B ON A.field1 = B.field1

LEFT JOIN C ON A.field2 = C.field2 AND B.field3 = C.field3 AND C.field4 > 1;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值