Anda memiliki dua catatan di setiap tabel di mana area
adalah 01
, dan Anda perlu menyetelnya ke nilai yang berbeda untuk memenuhi kunci utama - Anda tidak dapat menyetel keduanya ke nilai maks atau min dari tabel kedua, jadi Anda tidak benar-benar ingin melakukan pengelompokan apa pun.
Sepertinya tidak ada urutan lain antara catatan dengan area
yang sama , jadi saya akan menganggap itu sewenang-wenang dan tidak masalah catatan mana untuk setiap area
mendapatkan branch_code
. mana dari meja lainnya. Jika tidak sewenang-wenang maka aturan perlu ditentukan...
Pembaruan yang berkorelasi rumit jika Anda perlu mencocokkan pada urutan arbitrer dalam sekelompok catatan. Anda memerlukan beberapa cara untuk mengidentifikasi urutan baris, tetapi menambahkan row_number()
kolom ke tabel asli untuk membuat tampilan sebaris akan menyebabkan kesalahan ORA-01732.
Namun, Anda dapat menggunakan rowid
table tabel target kolom semu; Anda hanya perlu melakukan penggabungan tambahan dalam korelasi untuk mendapatkan nilai yang sama bersama dengan branch_code
baru . Sesuatu seperti:
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;
Yang memberi Anda:
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
Sekarang Anda tidak benar-benar membutuhkan semua kolom itu, Anda hanya perlu rid
(branch_cp.rowid
) dan branch_cp_2.branch_code
yang berkorelasi .
Tetapi Anda juga hanya ingin memperbarui ketika ada kecocokan - untuk membatalkan nulling setiap baris di mana tidak ada nilai di tabel lain - jadi Anda harus mengulangi penggabungan itu di exists
subkueri.
Lebih mudah melakukan 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.
Meja Anda sekarang memiliki:
select * from branch_cp;
AREA BRANCH_CODE BRANCH_NAME
----- ----------- -----------
01 04 A
01 05 B
03 06 C