我有两张桌子
包含project_id,id和load_date
列的TABLE_A和TABLE_B,列为project_id,delete_flag和delete_date
其中TABLE_A.load_date是一个新列,我想基于TABLE_B.delete_date为历史数据填充它。基本上,文件已经重复加载到系统中,并且历史上我们没有跟踪它何时被加载。但是,每次重新加载文件时,在TABLE_B中使用delete_date(即软删除)更新其先前版本。以前的版本只是保留在TABLE_A中而没有任何更改。
我想根据TABLE_B中的匹配项目填充TABLE_A.load_date。 TABLE_A中最旧的行(最小的TABLE_A.id)与TABLE_B中最旧的行(最旧的delete_date)等匹配。因此,如果您按顺序从每个表中选择下一行,则行应该匹配。但我不知道如何将其变成Oracle声明。到目前为止我所得到的是没有处理行顺序匹配的内容:
MERGE INTO TABLE_A a
USING
(
SELECT PROJECT_ID, DELETE_DATE
FROM TABLE_B
WHERE DELETE_FLAG = 'Y'
ORDER BY DELETE_DATE ASC
) b ON (a.PROJECT_ID = b.PROJECT_ID)
WHEN MATCHED THEN UPDATE
SET a.LOAD_DATE = p.DELETE_DATE;
答案 0 :(得分:1)
只要我正确理解您的标准,此合并应该可以完成工作:
merge into table_a ta
using (
select pid project_id, id, delete_date
from (
select project_id pid, id,
row_number() over (partition by project_id order by id) rn
from table_a) a
join (
select project_id pid, delete_date,
row_number() over (partition by project_id order by delete_date ) rn
from table_b
where delete_flag='Y') b using (pid, rn) ) tb
on (ta.project_id = tb.project_id and ta.id = tb.id)
when matched then update
set ta.load_date = tb.delete_date