Имате два записа във всяка таблица, където area
е 01
и трябва да ги зададете на различни стойности, за да удовлетворите първичния ключ - не можете да ги зададете и двете на максимална или минимална стойност от втората таблица, така че всъщност не искате да правите групиране.
Изглежда, че няма друго подреждане между записи с една и съща area
, така че ще приема, че е произволно и няма значение кой запис за всяка area
получава кой branch_code
от другата маса. Ако не е произволно, тогава правилата трябва да бъдат посочени...
Корелираната актуализация е трудна, ако трябва да съвпаднете в произволен ред в рамките на група записи. Имате нужда от някакъв начин да идентифицирате реда на редовете, но добавяне на row_number()
колона към оригиналните таблици за създаване на вграден изглед ще доведе до грешка ORA-01732.
Можете обаче да използвате rowid
на целевата таблица псевдоколона; просто трябва да направите допълнително присъединяване в корелацията, за да получите същата стойност заедно с новия branch_code
. Нещо като:
select bc.rid,
bc.area,
bc.branch_code,
bc.branch_name,
bc2.area,
bc2.branch_code,
bc2.branch_name
from (
select bc.*,
bc.rowid as rid,
row_number() over (partition by bc.area order by bc.branch_code) as rn
from branch_cp bc
) bc
join (
select bc2.*,
row_number() over (partition by bc2.area order by bc2.branch_code) as rn
from branch_cp_2 bc2
) bc2
on bc2.area = bc.area
and bc2.rn = bc.rn;
Което ви дава:
RID AREA BRANCH_CODE BRANCH_NAME AREA BRANCH_CODE BRANCH_NAME
------------------ ----- ----------- ----------- ----- ----------- -----------
AAAwy+AAEAAAA0DAAA 01 01 A 01 04 D
AAAwy+AAEAAAA0DAAB 01 02 B 01 05 E
AAAwy+AAEAAAA0DAAC 03 03 C 03 06 F
Сега всъщност нямате нужда от всички тези колони, имате нужда само от rid
(branch_cp.rowid
) и корелирания branch_cp_2.branch_code
.
Но също така искате да актуализирате само когато има съвпадение - за да анулирате нулирането на всички редове, където няма стойност в другата таблица - така че ще трябва да повторите това присъединяване в exists
подзаявка.
По-лесно е да направите merge
:
merge into branch_cp bc
using (
select bc.rid,
bc2.branch_code
from (
select bc.*,
bc.rowid as rid,
row_number() over (partition by bc.area order by bc.branch_code) as rn
from branch_cp bc
) bc
join (
select bc2.*,
row_number() over (partition by bc2.area order by bc2.branch_code) as rn
from branch_cp_2 bc2
) bc2
on bc2.area = bc.area
and bc2.rn = bc.rn
) bc2
on (bc.rowid = bc2.rid)
when matched then update set bc.branch_code = bc2.branch_code;
3 rows merged.
Вашата таблица вече има:
select * from branch_cp;
AREA BRANCH_CODE BRANCH_NAME
----- ----------- -----------
01 04 A
01 05 B
03 06 C