Логика дельта-загрузки с использованием оператора Oracle Merge sql

У меня есть таблица TEST_RUA, куда я ежедневно импортирую данные. Я использую для этой таблицы логику усечения и вставки. Теперь у меня есть другая таблица TEST_RUA_MER, такая же, как таблица TEST_RUA, где я хочу применить логику загрузки Delta. В обеих таблицах всегда есть уникальная комбинация значений столбцов ID_LL, ID_UU, TKR.

Логика Delta должна быть:

Для обновления: я хочу сравнить данные из таблиц TEST_RUA_MER и TEST_RUA, а затем обновить таблицу TEST_RUA_MER только тогда, когда в обеих таблицах существует уникальная комбинация значений столбца ID_LL, ID_UU, TKR и когда есть изменение в любом значении поля. в таблице TEST_RUA. Мы также можем ввести новый столбец с именем status и обновить статус как «UPD» для этих строк, чтобы при необходимости можно было отфильтровать данные в представлении.

Для вставки: если уникальная комбинация значений столбцов ID_LL, ID_UU, TKR не существует в таблице TEST_RUA_MER, но существует в таблице TEST_RUA, вставьте данные в таблицу TEST_RUA_MER.

Удалить: оператор Delete можно выполнить отдельно. Мы должны использовать оператор Delete, чтобы удалить данные из таблицы TEST_RUA_MER, которой нет в таблице TEST_RUA, при использовании уникальной комбинации столбцов ID_LL, ID_UU, TKR, а также удалить данные из таблицы TEST_RUA_MER, которая равна таблице TEST_RUA. Итак, в таблице TEST_RUA_MER я просто хочу обновлять и обновлять данные из таблицы TEST_RUA. Если удалить невозможно, мы также можем создать просто View, чтобы отфильтровать данные, если это возможно.

Можно ли этого достичь с помощью одного оператора слияния и отдельно оператора удаления или есть ли другая логика, которую мы можем реализовать? Я не хочу использовать pl / sql для этой логики. Но я также могу использовать Sql View для любого условия сравнения, потому что в конце я просто хочу сгенерировать отчет csv с таблицей дельта-нагрузки.

Ниже приведена скрипта sql для создания и вставки оператора: 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

person Symonds    schedule 19.01.2021    source источник


Ответы (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

person Popeye    schedule 19.01.2021
comment
спасибо, и как мы можем использовать оператор Delete для удаления данных из таблицы TEST_RUA_MER, которой нет в таблице TEST_RUA, при использовании уникальной комбинации столбцов ID_LL, ID_UU, TKR, а также удалить данные из таблицы TEST_RUA_MER, которая равна таблице TEST_RUA - person Symonds; 19.01.2021
comment
Это должен быть другой оператор sql, поскольку слияние может обрабатывать только те случаи, когда данные совпадают и не совпадают на основе условия ON. И мы фактически добавляем данные в таблицу TEST_RUA_MER, когда они отсутствуют в таблице TEST_RUA. Теперь вы хотите его удалить? - person Popeye; 19.01.2021
comment
да, мне нужен отдельный статус удаления для этого ... у меня есть скрипт update db, и в конце после удаления должны быть только данные в таблице TEST_RUA_MER, которая обновляется, а новые данные существуют в таблице TEST_RUA ..... dbfiddle.uk/ - person Symonds; 19.01.2021
comment
Вы можете видеть, что в таблице TEST_RUA_MER есть строка BREG SQTUREGBFNO LRQU, которая не существует в таблице TEST_RUA, а также строка BOND BERF GV9999B12M1 TKXX TES_RES и строка BOND BERF FV9999B12M3 BURR PRS_RES, которую нужно удалить, в этой таблице нужно удалить строку TEST_RES .... из таблицы TEST_RUA_MER - person Symonds; 19.01.2021
comment
Используйте СУЩЕСТВУЕТ, а НЕ СУЩЕСТВУЕТ. и да, вы должны задавать только один вопрос / сомнение / вопрос в одном вопросе, чтобы поддерживать руководящие принципы SO. Попробуйте сами, и если вы обнаружите проблему, вы можете снова задать вопрос на SO, и да, вы можете принять этот ответ. - person Popeye; 19.01.2021
comment
Есть ли причина для отказа от ответа? - person Popeye; 20.01.2021
comment
решение не было выполнено ... и вы упомянули, что в Merge три операции не могут выполняться, но это возможно ... см. dbfiddle.uk/ ... Теперь я столкнулся с новой проблемой, когда я попытался выполнить слияние с огромным набором данных, я получаю ошибки, поскольку ORA-08006: указанная строка больше не существует ... я опубликую новый вопрос для этого .. - person Symonds; 20.01.2021
comment
И где я вам сказал, что это невозможно? Где я сказал вам, что в Merge не могут выполняться три операции? Вы упомянули в своем комментарии - да, я хочу, чтобы для этого был отдельный статус удаления, и SO не является платформой для создания кода. Очень сложно понять всю программу ОП и ответить по их требованию. Если вы где-то застряли, спросите на SO. Не запрашивайте код всего приложения. - person Popeye; 20.01.2021