Проблема в том, что для oano = 0001
и code = swg1
у вас есть три значения slno: 1, 3, 5. Таким образом, Oracle не знает, какое из них использовать. Если вы хотите минимальное или максимальное значение, используйте min()
или max()
в исходной части и удалите slno
из group by
предложения:
merge into itbg_intend_items tgt
using (select oano, pcode, min(slno) slno
from itbg_order_items
group by oano, pcode) src
on (tgt.icode = src.pcode and tgt.oano = src.oano)
when matched then update set tgt.slno= src.slno
Но если вы хотите назначить все значения, которые появляются в исходной таблице, вы должны соотнести строки как-то . Это «как-то» можно сделать, например, назначив номера строкам и присоединив таблицы таким образом. Такие подготовленные данные могут быть использованы в качестве источника в вашем merge
утверждении:
merge into itbg_intend_items tgt
using (
select rwd, oano, pcode, slno
from (select oano, pcode, slno,
row_number() over (partition by oano, pcode order by null) rn
from itbg_order_items)
join (select rowid rwd, oano, icode pcode,
row_number() over (partition by oano, icode order by null) rn
from itbg_intend_items)
using (oano, pcode, rn)) src
on (tgt.icode = src.pcode and tgt.oano = src.oano and tgt.rowid = src.rwd)
when matched then update set tgt.slno= src.slno
Демоверсия dbfiddle
Конечно, могут быть некоторые проблемы, например, недостаточно значений в источнике для заполнения цели. Или вам может потребоваться конкретный заказ (в этом случае измените порядок на row_number()
с). Все это можно сделать, но вы должны сказать нам, что вы хотите в таких ситуациях.