join 后的where你清楚吗?

今天,在对两张表进行left join时候,总是查询少结果,并不是所要的答案,原来的语句:

select aa.RoomId, bb.SectionID from aa left join bb on aa.RoomId = bb.OldForumID 
where aa.del = 0 and bb.ParentID != '00000000'  and bb.IsDeleted = 'false'  
group by aa.RoomId, bb.SectionID

结果只显示了276条,缺少了4条结果,这4条结果中的第二列SectionID 为NULL;后来经头提点,把语句改成:

select aa.RoomId, bb.SectionID from aa left join bb on aa.RoomId = bb.OldForumID 
and bb.ParentID != '00000000' and bb.IsDeleted = 'false' 
where aa.del = 0
group by aa.RoomId, bb.SectionID


这样得出的结果正是我要的280条记录,包括第二列SectionID 为NULL的记录。以上的查询方式,你是否看出了点猫腻?猫腻就在 and bb.ParentID != '00000000'  这个条件是加在where之前还是之后,先说加在之后吧,之后是表示先对这两张表进行了join,然后在此结果集中再进行where条件筛选,而在SQLServer中为NULL值列的判断就认为是true了,所以那4条为NULL的记录就查询不出来了;反而要是把那个条件加在了where子句之前,则是先对此条件进行筛选后再进行join,而本身表bb此字段是不会有NULL值的,这样进行join后的值就会有第二列SectionID 为NULL的记录,也就是说查询后的涉及到join后的那张表的字段的条件应该都在where之前加上。这样想以后其实这条语句还可以修改为:

select aa.RoomId, bb.SectionID from aa left join bb on aa.RoomId =  bb.OldForumID 
where aa.del = 0 and (bb.ParentID is null or bb.ParentID != '00000000'
and (bb.IsDeleted is null or  bb.IsDeleted = 'false'  )
group by aa.RoomId, bb.SectionID

不过,语句还不如上一个简洁。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值