left join时,在where中增加对右表的条件

对left join,然后对右表增加where条件的不同情况做具体分析

tableA

idb_id
11
22
33

 

tableB

idramark
1value1
2 null(不是字符串)

------------- 

不同场景的sql:

sql1:select a.*,b.remark from tableA a  left  join tableB b on a.b_id = b.id where a.id=3;

sql2:select a.*,b.remark from tableA a inner join tableB b on a.b_id = b.id where a.id=3;

sql3:select a.*,b.remark from tableA a jeft join tableB b on a.b_id = b.id where a.id=3 and b.remark ='value';

sql4:select a.*,b.remark from tableA a jeft join tableB b on a.b_id = b.id where a.id=2 and b.remark is null;

-------------

执行结果分析:

sql1:常规写法,可以查询到数据,但是字段remark为null,这里表示的是没有关联到tableB的数据

sql2:常规写法,查询不到数据;

sql3:查询不到数据,原因,在sql1的基础上 ,where条件中有一条对右表tableB的条件b.remark ='value',再次对结果过滤,没有符合条件的数据,结果为空;这里要说明一下,有类似的帖子对这种情况做过说明,但是可能不够详细,只说了如果对left join中的右表做了where条件过滤,就等于是inner join,这是有问题的,原因请看sql4;

sql4:结合sql3的分析,left join 时关联到了tableB中id等于2的数据,需要注意这条数据的remark字段为null,不是没查到,然后再一次通过条件 b.remark is null过滤,得到了一条数据;所以,left join 时,对右表加where条件等于inner join的说法是错误的,这只是和inner join 的结果碰巧相同而已;

转载于:https://my.oschina.net/hewenbin/blog/1548319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值