增量加载逻辑使用oracle合并sql语句



我有表TEST_RUA,我每天导入数据。我对这个表使用截断和插入逻辑。现在我有另一个表TEST_RUA_MER与表TEST_RUA相同,我想应用Delta加载逻辑。在两个表中,总是存在唯一的列值ID_LL, ID_UU, TKR组合。

Delta逻辑应该是:

为更新:我想比较表TEST_RUA_MERTEST_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_MERTEST_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&lt的在小提琴

最新更新