各テーブルにarea
がある2つのレコードがあります 01
です 、および主キーを満たすためにそれらを異なる値に設定する必要があります-2番目のテーブルの最大値または最小値の両方に設定することはできないため、実際にはグループ化を行いたくありません。
同じ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
SQLフィドル 。