我有表TEST_RUA
,我每天导入数据。我对这个表使用截断和插入逻辑。现在我有另一个表TEST_RUA_MER
与表TEST_RUA
相同,我想应用Delta加载逻辑。在两个表中,总是存在唯一的列值ID_LL, ID_UU, TKR
组合。
Delta逻辑应该是:
为更新:我想比较表TEST_RUA_MER
和TEST_RUA
的数据,然后只有当两个表中存在列值ID_LL, ID_UU, TKR
的唯一组合以及表TEST_RUA
中任何字段值发生变化时才更新表TEST_RUA_MER
。我们还可以引入新的列,称为status,并将这些行的状态更新为'UPD',以便我们可以过滤出视图中的数据,如果需要的话。
插入:如果TEST_RUA_MER
表中没有ID_LL, ID_UU, TKR
列值的唯一组合,而TEST_RUA
表中有,则将数据插入到TEST_RUA_MER
表中。
删除:Delete语句可以单独执行。我们必须使用Delete语句删除表TEST_RUA_MER
中TEST_RUA
中不存在的数据,同时使用ID_LL, ID_UU, TKR
列的唯一组合,并删除表TEST_RUA_MER
中与表TEST_RUA
相同的数据。所以在表TEST_RUA_MER
我只是想保持更新和新的数据从表TEST_RUA
。如果不能删除,我们也可以创建一个视图来过滤掉数据,如果可能的话。
是否可以单独使用merge语句和delete语句来实现,或者是否有其他逻辑可以实现?我不想为这个逻辑使用pl/sql。但我也可以使用Sql视图的任何比较条件,因为在结束时,我只是想与增量加载表生成csv报告。
下面是创建和插入语句的sql fiddle:https://dbfiddle.uk/?rdbms=oracle_18&小提琴= 6288 a8b83149d3d543a776b9690bb59f
下面是sql语句:
创建TEST_RUA
表:
Create table TEST_RUA (CLASS VARCHAR2(100), ID_LL VARCHAR2(100), ID_UU VARCHAR2(100), TKR VARCHAR2(100), NAME VARCHAR2(100))
插入TEST_RUA
表:
INSERT INTO TEST_RUA VALUES ('Bond', 'BERF', 'GV9999B12M1', 'TKXX', 'TES_RES');
INSERT INTO TEST_RUA VALUES ('Bond', 'BERT', 'FV9999B12M3', 'BURR', 'PRS_RES');
INSERT INTO TEST_RUA VALUES ('Bond', 'BREG', 'TV9999B12M4', 'CVKR', 'FRTG_OP');
INSERT INTO TEST_RUA VALUES ('Bond', 'BREG', 'SQTUREGBFNO', 'LRQU', 'BEGT_TU');
创建TEST_RUA_MER
表:
Create table TEST_RUA_MER (CLASS VARCHAR2(100), ID_LL VARCHAR2(100), ID_UU VARCHAR2(100), TKR VARCHAR2(100), NAME VARCHAR2(100));
插入TEST_RUA_MER
表:
INSERT INTO TEST_RUA_MER VALUES ('Bond', 'BERF', 'GV9999B12M1', 'TKXX', 'TES_RES');
INSERT INTO TEST_RUA_MER VALUES ('Bond', 'BERT', 'FV9999B12M3', 'BURR', 'PRS_RES');
INSERT INTO TEST_RUA_MER VALUES ('Bond', 'BREG', 'TV9999B12M4', 'CVKR', 'MT_QUE');
INSERT INTO TEST_RUA_MER VALUES ('Bond', 'BREG', 'LV9999B12F6', 'OPTQ', 'BWQT_UI');
表TEST_RUA_MER
的期望输出:
CLASS ID_LL ID_UU TKR NAME
Bond BREG TV9999B12M4 CVKR FRTG_OP
Bond BREG SQTUREGBFNO LRQU BEGT_TU
可以这样使用MERGE
语句:
merge into TEST_RUA_MER trg
using TEST_RUA src
on (trg.ID_LL = src.ID_LL and trg.ID_UU = src.ID_UU and trg.TKR = src.TKR)
when matched then
update set trg.name = src.name
when not matched then
insert values (src.class, src.ID_LL, src.ID_UU, src.TKR, src.name)
,db<的在小提琴