一、问题
两张表tb1、tb2都有domain、update_time字段,需要按tb1.domain查出所有数据,并且tb1、tb2都是当天的数据。
最开始想到两种办法:
select tb1.*,tb2.* from
(select * from tb1 where DATE(update_time)='{{{today}}}') t1
left join
(select * from tb2 where DATE(update_time)='{{{today}}}') t2
on t1.domain=t2.domain
select tb1.*,tb2.* from
tb1 left join tb2
on tb1.domain=tb2.domain
where DATE(tb1.update_time)='{{{today}}}' and (DATE(tb2.update_time)='{{{today}}}' or tb2.domain is null)
结果是前者比后者多了一点点数据。为什么呢?
二、解析
tb1
domain | update_time |
---|---|
d1 | 旧 |
d1 | 新 |
d2 | 新 |
d3 | 新 |
tb2
domain | update_time |
---|---|
d1 | 旧 |
d1 | 新 |
d2 | 旧 |
方法(1)的数据是
domain | update_time | domain | update_time |
---|---|---|---|
d1 | 新 | d1 | 新 |
d2 | 新 | null | null |
d3 | 新 | null | null |
方法(2)的数据是
domain | update_time | domain | update_time |
---|---|---|---|
d1 | 新 | d1 | 新 |
d3 | 新 | null | null |
可以看到方法(2)的where直接把d2新的数据直接去掉了,正常应该是有d2数据的,虽然left join后tb2的数据是null