【发布时间】:2021-01-19 10:23:02
【问题描述】:
我有表 TEST_RUA 我每天都在其中导入数据。我正在为此表使用截断和插入逻辑。现在我有另一个表TEST_RUA_MER 与表TEST_RUA 相同,我想在其中应用增量负载逻辑。两个表中的列值ID_LL, ID_UU, TKR 总是唯一的组合。
Delta 逻辑应该是:
更新:我想比较表 TEST_RUA_MER 和 TEST_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