我有两个表如下:
表A:
| ID|年龄|部|工资|开始日期|
| --|--|--|--|--|
| 1 | 30 |一|一千块|二○年一月一日|
| 1 | 31 |B|一千二|2022年1月1日|
| 2 | 25 |C|一千二|2019 -06- 01|
| 2 | 26 |一|一千三百块|2022年1月1日|
| 3 | 34 |D|一千四|2021年1月1日|
| 3 | 35 |C|一千八百块|2022年1月1日|
表B:
| ID|工资|开始日期|
| --|--|--|
| 1 |一千五|2019 - 01-06|
| 2 |一千八百块|2022年1月1日|
| 3 |一千六百块|2019 -06- 01|
当表A和表B之间的ID和start_date组合不匹配时,我想在表A中插入合成新记录。新的记录应该从表A中获取与表B中缺失的记录具有最近开始日期的记录的年龄和部门,并从表B中获取工资和开始日期。
输出:
| ID|年龄|部|工资|开始日期|
| --|--|--|--|--|
| 1 | 30 |一|一千块|二○年一月一日|
| 1 | 31 |B|一千二|2022年1月1日|
| 1 | 31 |B|一千五|2019 - 01-06|
| 2 | 25 |C|一千二|2019 -06- 01|
| 2 | 26 |一|一千三百块|2022年1月1日|
| 3 | 34 |D|一千四|2021年1月1日|
| 3 | 34 |D|一千六百块|2019 -06- 01|
| 3 | 35 |C|一千五|2022年1月1日|
请帮助编写SQL查询,这将实现这一点。
我在确定表A中的行与表B中的记录具有最接近的start_date时遇到了问题。
2条答案
按热度按时间kuuvgm7e1#
使用
UNION ALL
将两个表合并合并,然后使用LAST_VALUE
解析函数来获取不存在的最新age
和dept
值:其中,对于样本数据:
输出:
| ID|年龄|部|工资|开始日期|
| --|--|--|--|--|
| 1 | 30 |一| 1000 |2000-01-01 00:00:00|
| 1 | 31 |B| 1200 |2019 -01- 22 00:00:00|
| 1 | 31 |B| 1500 |2019 -06- 21 00:00:00|
| 2 | 25 |C| 1200 |2019 -06-01 00:00:00|
| 2 | 26 |一| 1300 |2019 -01- 22 00:00:00|
| 2 | 26 |一| 1800 |2019 -01- 22 00:00:00|
| 3 | 34 |D| 1400 |2021-01-01 00:00:00|
| 3 | 34 |D| 1600 |2019 -06-01 00:00:00|
| 3 | 35 |C| 1800 |2019 -01- 22 00:00:00|
如果你想
INSERT
缺失的行,那么在Oracle 12中,你可以使用LATERAL
连接和FETCH FIRST ROW ONLY
来查找table_b
的每行的最新age
和dept
值:fiddle
f1tvaqid2#
如果我得到了正确的-只是没有匹配的ID行,START_DATE组合(在两个表中)应该被添加。这意味着表B中ID = 2的行不会影响表A中的匹配行。如果是这种情况,那么您需要将所有来自表的union与Row_Number()和Last_Value()分析函数沿着一些Case表达式组合在一起。
.生成的数据集应为:
.这可以合并到表A中以插入缺失的行:
注意:ON子句应该被调整(可能)以确保表A中的行寻址是唯一的。