UPDATE文で、複数のレコードを一回のトランザクション内で更新する必要に迫られました。
基本的に、今まで使ってきたUPDATE文では、
UPDATE tableA set COL1 = 1 ,COL2 = 2 ,COL3 = 3 : where COL10 = 0
こんな感じで、条件で絞れる範囲での複数レコードの更新がせいぜいでした。
これだと、COL10 = 10 を満たすレコードが全て更新されます。
画面の明細に表示されたデータを1行ずつ~ってんなら、単純に力技で1行ずつUPDATE文を明細から取得してループさせるんですが。
ただ、今回は明細ではなく、関連するテーブルが複数あって、連鎖的に更新が必要な状況でした。
ID代わりに使う番号も、シーケンス管理で変更されるので、IDを頼りに辿ることも出来ない状況・・・
tableAとtableBを紐付けるIDが変わってしまうため、同時更新をせざるを得ない。
そんなこと出来るの?って思ってたら、出来るみたいでした。
参考URL
【Oracle】JOINを使ったUPDATE文で複数レコードを同時に更新する
ポイントは、Update句の中でJoinが使えないのでサブクエリ内でJOINを指定します。
UPDATE ( SELECT t1.NAME t1name, t1.FURIGANA t1furigana, t1.SEIBETSU t1seibetsu, t2.NAME t2name, t2.FURIGANA t2furigana, t2.SEIBETSU t2seibetsu FROM table01 t1 INNER JOIN table02 t2 ON t1.id = t2.id ) SET t1name = t2name, t1furigana = t2furigana WHERE t1seibetsu = '女';
SELECT文ではサブクエリは割りと良く使うんですが、JOINしたサブクエリをUPDATE文に持ち込むって言う発想にどうやったら辿りつくのか・・・
まだまだ世の中は広いなぁ。