如何解决使用oracle合并sql语句的增量加载逻辑
我有表 TEST_RUA
,我每天都在其中导入数据。我正在为此表使用截断和插入逻辑。现在我有另一个表 TEST_RUA_MER
与表 TEST_RUA
相同,我想在其中应用增量加载逻辑。两个表中始终存在列值 ID_LL,ID_UU,TKR
的唯一组合。
Delta 逻辑应该是:
更新:我想比较表 TEST_RUA_MER
和 TEST_RUA
中的数据,然后仅在列的唯一组合时才更新表 TEST_RUA_MER
值 ID_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 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','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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。