Oracleで複数レコードを更新する方法

投稿日:2017-08-31

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文に持ち込むって言う発想にどうやったら辿りつくのか・・・

まだまだ世の中は広いなぁ。







-ORACLE
-, ,

関連記事

Oracle Database Bronzeの勉強を始めました。

業務でOracleを使ってます。 DBへの接続と簡単なSQLの確認ぐらいだったら、SQLDeveloperとかのツールを使わずにSQLPlusだけで済ませちゃう人も多いのかな? あとは、SQLのバッチ …

[ORACLE]最初の有効値を返すCOALESCE・・・読み方分からねぇw

知らなかったら、多分CASEとかで判定してた。 まぁ、人の書いたSQLは勉強になるよねって話・・・じゃないなw 事の発端は、今のプロジェクトで別の人が作った画面の修正をやることになったこと。 その人は …

no image

Oracleの再受験無料キャンペーンは5月31日まで

【ピアソンVUE専用】Oracle会場試験用受験チケット(電子チケット) 価格:26,720円 (2019/5/19 14:11時点) 感想(15件) 【ピアソンVUE専用】Oracleオンライン試験 …

OracleでORA-01747 : 指定された列が無効ですのエラーの分かりづらさ・・・

OracleでORA-01747 : 指定された列が無効ですのエラーの分かりづらさったらありません・・・ SQLのUPDATE文の実行時に 「ORA-01747 : 指定された列が無効です」 とエラー …

Oracleで「ORA-00906: 左カッコがありません。」のエラーが出た時の対処法

はい。 そろそろ、上司の無茶目な仕様変更にも折り合いをつけて行きたいSEっぽいことをやってる人です。 前にも書いたかもしれないけど、また、どハマリしたOracleのエラーについて。 エラーの内容が全て …


カテゴリー