При условии, что у вас есть первичный (или уникальный) ключ на (sgr, cdd)
, вы можете преобразовать его в оператор insert ... on conflict
:
insert into table1 (SGR, CDD)
select distinct g.CDD, d.SGR
from table2 g
join table3 d ON g.IDF = d.IDF
on conflict (cdd, sgr) do nothing;
Если у вас нет уникального ограничения (в связи с этим возникает вопрос: почему?) тогда должен работать прямой оператор INSERT ... SELECT (что также могло бы ухудшить работу Oracle).
WITH f AS (
SELECT distinct g.CDD, d.SGR
from table2 g
join table3 d on g.IDF = d.IDF
)
INSERT INTO table1 (SGR, CDD)
SELECT f.SGR, f.CDD
FROM f
WHERE NOT EXISTS (select *
from table1 t1
join f on (t1.sgr, t1.cdd) = (f.cdd, f.sgrf));
Обратите внимание, что это НЕ безопасно для одновременного выполнения (и ни один из операторов Oracle MERGE).Вы все еще можете получить дубликаты значений в таблице1 (в отношении комбинации (sgr,cdd)
).
Единственный разумный способ предотвратить дублирование - это создать уникальный индекс (или ограничение), который позволит вам использовать гораздо более эффективный insert on conflict
.Вы должны действительно учитывать, что если ваши бизнес-правила запрещают дублирование.
Обратите внимание, что я преобразовал ваше древнее неявное объединение в предложении WHERE в современный явный оператор JOIN
,но это не обязательно, чтобы это работало.