最近在写hql取数据的时候,发现不同的写法会模糊left join 和 join,使得得出的结果不是预期的。
分别列出三段hql供参考:
1、下面是第一段hql,将相关联的两张表(or 多张表)的条件都写在最后的where下:
select a.cola1,a.cola2,b.colb1
from tablea a
left join tableb b on a.id=b.id
where
a.dt='20200826'
and b.dt='20200826'
;
结果:这样的写法会使得 left join 失效,得到的结果是两张表 join 的结果。主表的数据会丢失。
2、下面是第二段hql,where后边只有主表的条件,其他表的条件写在了 on 的后边:
select a.cola1,a.cola2,b.colb1
from tablea a
left join tableb b on a.id=b.id and b.dt='20200826'
where
a.dt='20200826'
;
结果:这样的写法可以正确使用left join ,得到预期的结果。主表的数据不会丢失。
3、下面是第三段hql,使用select语句以及where得到两张需要的表,再进行left join:
select * from
(select cola1,cola2 from tablea where dt='20200826')a
left join
(select colb1 from tableb where dt='20200826')b
on a.id=b.id
;
结果:这样的写法可以正确使用 left join,得到预期的结果。主表的数据不会丢失。
结论:
第一种写法看着是left join,实际执行的是join,得到的可能不是预期的结果,需要谨慎使用。第二种和第三种写法得到的都是预期的结果。
至于为什么会这样,更深层的执行方式由于才疏学浅,暂时没有精力弄明白,还望有明白的大神赐教,欢迎评论区留言~~!