解决全量表关联的问题
一.问题说明
需求:有两张全量表,现在要进行关联,关联字段是id,每天的全量区分字段是fdate,现在要进行左联,以左表为主表,报送当天的数据。
表一
id | name | fdate |
---|---|---|
1 | 张三 | 2021-05-31 |
2 | 李四 | 2021-05-31 |
表二
id | name | fdate |
---|---|---|
1 | 王倩倩 | 2021-05-31 |
错误做法 :我想大部分人刚开始也可能会这样做
select * from table1 left join table2 on table1.id = table2.id
where table1.fdate = '2021-05-31'
and table2.fdate = '2021-05-31';
想象中的结果集
id | name | fdate | id(1) | name(1) | fdate(1) |
---|---|---|---|---|---|
1 | 张三 | 2021-05-31 | 1 | 王倩倩 | 2021-05-31 |
2 | 李四 | 2021-05-31 |
实际中的结果集
id | name | fdate | id(1) | name(1) | fdate(1) |
---|---|---|---|---|---|
1 | 张三 | 2021-05-31 | 1 | 王倩倩 | 2021-05-31 |
结果是少了一条数据 当然这只是测试的案例,在实际开发中,尤其是在银行中做开发,这一张表就有上亿条数据,如果我们这样做,那上报数据的准确性自然是差的不能再差了,解决方案如下:
我们不妨观察下不带where条件的结果集
id | name | fdate | id(1) | name(1) | fdate(1) |
---|---|---|---|---|---|
1 | 张三 | 2021-05-31 | 1 | 王倩倩 | 2021-05-31 |
2 | 李四 | 2021-05-31 |
发现table2的id、name、 fdate是空值,我们可以这些条件作为判断,当然这里取一个值就可以作判断,最合理的当然是取fdate,于是sql就可以这样写:
select * from table1 left join table2 on table1.id = table2.id
where table1.fdate = '2021-05-31'
and table2.fdate = '2021-05-31' and table2.fdate is null;
于是结果集就成了理想中的结果集:
id | name | fdate | id(1) | name(1) | fdate(1) |
---|---|---|---|---|---|
1 | 张三 | 2021-05-31 | 1 | 王倩倩 | 2021-05-31 |
2 | 李四 | 2021-05-31 |
问题:这样写是没错,但是会滋生一个问题,当你连接的表越多,你在where后加的判空条件就越多,但是目前还没想到更好的解决方法,有想法欢迎评论区留言。