如何解决获取表A中的所有记录以及表B中尚不存在的所有条目
我有一个包含2个表(表A和表B)的Oracle DB。
表A的数据质量更好,但仅适用于有限的一组条目。表A也有多个条目(由于历史原因),每个数字我只需要最后一个。
所以我需要从表A中获取所有条目,然后从表B中获取不在表A中的其余条目。
我还需要从表B中获取一些数据到表A的结果中,因为该信息在表A中不存在(val1,val2,val3)。
那么可能是某种JOIN + GROUP BY吗?
表A:
number | valid_from | valid_to | pos1 | pos2 | pos3 | factor | loc
100 | 2020-03-01 | 2020-03-10 | 7 | 80 | 18 | 19 | 1
100 | 2020-03-10 | 2020-03-13 | 7 | 80 | 18 | 19 | 1
100 | 2020-03-13 | 2020-03-16 | 8 | 80 | 18 | 20 | 1
200 | 2020-03-02 | 2020-03-03 | 6 | 90 | 19 | 30 | 1
200 | 2020-03-03 | 2020-03-04 | 6 | 90 | 19 | 29 | 1
200 | 2020-03-04 | 2020-03-10 | 9 | 90 | 19 | 30 | 1
300 | 2020-03-10 | 2020-03-12 | 13 | 100 | 10 | 41 | 2
300 | 2020-03-12 | 2020-03-14 | 13 | 100 | 10 | 40 | 2
300 | 2020-03-14 | 2020-03-20 | 10 | 100 | 10 | 40 | 2
表B:
number | pos1 | pos2 | pos3 | val1 | val2 | val3 | top
100 | 7 | 70 | 18 | a | aa | aaa | 3
200 | 6 | 60 | 19 | b | bb | bbb | 4
300 | 5 | 50 | 10 | c | cc | ccc | 5
400 | 2 | 20 | 2 | d | dd | ddd | 16
500 | 3 | 30 | 3 | e | ee | eee | 28
最终结果应为:
number | pos1 | pos2 | pos3 | factor | loc | val1 | val2 | val3 | top
100 | 8 | 80 | 18 | 20 | 1 | a | aa | aaa | 3
200 | 9 | 90 | 19 | 30 | 1 | b | bb | bbb | 4
300 | 10 | 100 | 10 | 40 | 2 | c | cc | ccc | 5
400 | 2 | 20 | 2 | NULL | NULL | d | dd | ddd | 16
500 | 3 | 30 | 3 | NULL | NULL | e | ee | eee | 28
我该如何实现?我需要按数字填写“完全加入”和“分组依据”吗?不知道该怎么办或如何从表A中获取最新条目。
解决方法
select b.number,b.pos1,b.pos2,b.pos3,a.factor,a.loc,b.val1,b.val2,b.val3,b.top
from tableb b
left outer join tablea a
on b.number = a.number
您还可以使用NVL(b.pos1,a.pos1)
,这意味着如果b.pos1
为空,请使用a.pos1
我将其写为left join
并进行过滤:
select b.number,b.top
from b
left join (
select a.*,row_number() over(partition by number order by valid_from desc) rn
from a
) a on a.number = b.number and a.rn = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。