微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用oracle合并sql语句的增量加载逻辑

我有TEST_RUA,我每天都在其中导入数据。我正在为此表使用截断和插入逻辑。现在我有一个TEST_RUA_MER 与表 TEST_RUA 相同,我想在其中应用增量加载逻辑。两个表中始终存在列值 ID_LL,ID_UU,TKR 的唯一组合。

Delta 逻辑应该是:

更新:我想比较表 TEST_RUA_MERTEST_RUA 中的数据,然后仅在列的唯一组合时才更新表 TEST_RUA_MERID_LL,TKR 存在于两个表中,并且当表 TEST_RUA 中的任何字段值发生更改时。我们还可以引入名为 status 的新列并将该行的状态更新为“UPD”,以便我们可以如果需要,过滤视图中的数据。

对于插入:如果表ID_LL,TKR中不存在列值TEST_RUA_MER的唯一组合但存在于表TEST_RUA中,则将数据插入到表中TEST_RUA_MER

Delete:Delete 语句可以单独完成。我们必须使用Delete语句从表TEST_RUA_MER删除TEST_RUA中不存在的数据,同时使用列ID_LL,TKR的唯一组合,并从表TEST_RUA_MER删除数据这在表 TEST_RUA 中是相等的。因此,在表 TEST_RUA_MER 中,我只想保留表 TEST_RUA 中的更新数据和新数据。如果无法删除,我们也可以创建视图以尽可能过滤掉数据。

是否可以单独使用单个合并语句和删除语句来实现,或者我们可以实现其他逻辑吗?我不想将 pl/sql 用于此逻辑。但我也可以将 sql View 用于任何比较条件,因为最后我只想用增量加载表生成 csv 报告。

下面是用于创建和插入语句的 sql fiddlehttps://dbfiddle.uk/?rdbms=oracle_18&fiddle=6288a8b83149d3d543a776b9690bb59f

下面是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','SQTUREGBFNO','LRQU','BEGT_TU');

TEST_RUA_MER 表创建语句:

Create table TEST_RUA_MER (CLASS VARCHAR2(100),NAME VARCHAR2(100));

插入 TEST_RUA_MER 表的语句:

    INSERT INTO TEST_RUA_MER VALUES ('Bond','TES_RES');
    INSERT INTO TEST_RUA_MER VALUES ('Bond','PRS_RES');
    INSERT INTO TEST_RUA_MER VALUES ('Bond','MT_QUE');
    INSERT INTO TEST_RUA_MER VALUES ('Bond','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<>fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。