Не используйте select distinct
в подзапросе. Предполагается, что он может вернуть более одного ряда. Вместо этого используйте rownum = 1
. Итак, начните с:
update cr_archive a
set a.v_sales_person = (select b.v_sales_person
from table_2 b
where a.account_num = b.account_num and
A.PRODUCT_LABEL = b.PRODUCT_LABEL and
rownum = 1
);
Вы хотите оптимизировать это с индексом на table_2(account_num, PRODUCT_LABEL, v_sales_person)
. Индекс важен для производительности.
Далее выполняется обновление всех строк. Если это не нужно, это дорого. Итак:
update cr_archive a
set a.v_sales_person = (select b.v_sales_person
from table_2 b
where a.account_num = b.account_num and
A.PRODUCT_LABEL = b.PRODUCT_LABEL and
rownum = 1
)
where a.v_sales_person is null or
a.v_sales_person <> (select b.v_sales_person
from table_2 b
where a.account_num = b.account_num and
A.PRODUCT_LABEL = b.PRODUCT_LABEL and
rownum = 1
);
Наконец, если вам нужно обновить все строки, это будет довольно дорого. Вы можете найти один из следующих вариантов:
- Восстановите таблицу. Массивные вставки быстрее, чем массивные обновления.
- Забудьте об этом. Просто
JOIN
при запросе таблицы для получения имени. - Добавьте новую таблицу с тем же первичным ключом.