一、问题
两张表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
文章讨论了在两张表tb1和tb2中,按domain查询当天数据时,使用LEFTJOIN的不同方法导致结果差异的问题。方法1多出一点数据,因为LEFTJOIN保留了tb2中domain匹配但update_time非当天的数据。
1482

被折叠的 条评论
为什么被折叠?



