У меня есть таблица (TABLEA) с 1 миллионом записей, и записи заполняются из нескольких источников в эту таблицу (TABLEA). после того, как данные заполнены, записи обрабатываются нижестоящим.
Каждый раз, когда данные вставляются, значение столбца FLAG будет нулевым, а после его обработки в нисходящем потоке значение FLAG будет обновлено как Y.
Итак, в основном у меня есть требование проверять, прежде чем записи будут обрабатываться ниже по потоку.
Требование состоит в том, что для уже обработанных записей в TABLEA (FLAG = 'Y') и CODE = 'I' мне нужно проверить есть ли какие-либо другие записи с таким же значением для COLB, где FLAG равен нулю. Если он там, я хочу изменить CODE = 'D' (что означает, что он помечен для удаления) и FLAG = NULL
Я пишу слияние для этого, и его выполнение занимает около 3 часов. Я попытался объяснить план, и он не дал мне никаких рекомендаций. Так что можно ли переписать этот запрос.
MERGE INTO TABLEA SRC
using
(select COLB from TABLEA where FLAG IS NULL) TGT
on(SRC.COLB=TGT.COLB and SRC.FLAG is not null and SRC.CODE='I')
when matched then update set
CODE='D',FLAG = NULL;
commit;
Это моя входная запись, и перед выполнением запроса на слияние
COLA COLB CODE FLAG
-------------- --------- ---- ----
10001 3060 I Y
10002 3548 I Y
10003 3566 I Y
10004 5093 I Y
10005 3548 I Y
10008 3060 I NULL
Мой вывод должен выглядеть примерно так, как показано ниже. Здесь значение COLB одинаково для первой записи (уже обработанной) и последней записи (еще не обработанной), поэтому после запроса на слияние TABLEA выглядит так
COLA COLB CODE FLAG
-------------- --------- ---- ----
10001 3060 D NULL
10002 3548 I Y
10003 3566 I Y
10004 5093 I Y
10005 3548 I Y
10008 3060 I NULL