【问题标题】:Delta load logic using oracle merge sql statement使用oracle合并sql语句的增量加载逻辑
【发布时间】:2021-01-19 10:23:02
【问题描述】:

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

Delta 逻辑应该是:

更新:我想比较表 TEST_RUA_MERTEST_RUA 中的数据,然后仅当存在列值 ID_LL, ID_UU, TKR 的唯一组合时才更新表 ID_LL, ID_UU, TKR表和表TEST_RUA中的任何字段值发生变化时。我们还可以引入称为状态的新列并将此行的状态更新为“UPD”,以便我们可以在需要时过滤掉视图中的数据。

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

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

可以单独使用单个merge语句和delete语句来实现吗,或者我们可以实现其他任何逻辑吗?我不想为这个逻辑使用 pl/sql。但我也可以将 Sql View 用于任何比较条件,因为最后我只想生成带有增量负载表的 csv 报告。

下面是创建和插入语句的 sql fiddle: https://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', '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

【问题讨论】:

    标签: sql oracle merge sql-delete delta


    【解决方案1】:

    您可以使用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

    【讨论】:

    • 谢谢,我们如何使用 Delete 语句从表 TEST_RUA_MER 中删除表 TEST_RUA 中不存在的数据,同时使用列 ID_LL、ID_UU、TKR 的唯一组合,并从表 TEST_RUA_MER 中删除数据在表 TEST_RUA 中相等
    • 这必须是不同的sql语句,因为merge只能处理数据匹配和不匹配基于ON条件的情况。当TEST_RUA表中不存在数据时,我们实际上是在TEST_RUA_MER表中添加数据.现在要删除它吗?
    • 是的,我想要单独的删除语句...我有更新数据库小提琴,在删除后最后应该只有表 TEST_RUA_MER 中的数据被更新并且表 TEST_RUA 中存在新数据。 ...dbfiddle.uk/…
    • 您可以在表 TEST_RUA_MER 中看到 TEST_RUA 表中不存在的 BREG SQTUREGBFNO LRQU 行以及表 TEST_RUA 中的行 BOND BERF GV9999B12M1 TKXX TES_RES 和行 BOND BERF FV9999B12M3 BURR PRS_RES 相等... .so 我想从表 TEST_RUA_MER 中删除这一行
    • 使用 EXIST 和 NOT EXISTS。是的,您应该在一个问题中只问一个问题/疑问/问题以维护 SO 指导方针。自己尝试一下,如果你发现问题,那么你可以在 SO 上再次提问,是的,你可以考虑接受这个答案。
    猜你喜欢
    • 2020-07-30
    • 2013-05-11
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多