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
-, ,

関連記事

no image

OracleでLISTAGG関数を使ったら、世界が変わった話。

11gR2からGROUP_CONCAT(複数行をまとめて1列に)が可能に http://d.hatena.ne.jp/kkz_tech/20150311/1426048592 日本の中心付近で仕様変更 …

[ORACLE]ORA-00918:列の定義が未確定です・・・のエラーにならなかった

なんでエラーになるものをマージしてるんだ? と、怒られました。 一瞬、理解が出来ず・・・ で、エラーを再現してもらう・・・と。 あっさり発生。 早く修正しろって突っ返されました。 頭には「?」しか浮か …

C#で発生するORA-01036:illegal variable name/numberのエラーの解決法

毎度毎度、原因の分かりづらいエラーにハマりますw 今回は、「ORA-01036:illegal variable name/number」。 日本語に直訳された内容だと「変数の名前/数が無効です」とな …

ORACLEで「IMP-00013: DBAのみ別のDBAがエクスポートしたファイルをインポートできます。」の解決法。

客先DBのエクスポートしたものがインポートできずに、タイトルのエラーを吐く。 幸い、お客さんの目の前じゃなかったので、ゆっくり調べて解決できたけど、客先で発生したら困るよなぁ・・・ もともと英語のメッ …

[ORACLE]IMPコマンドで、複数テーブルをインポートする

OracleでIMPコマンドでdumpファイルをインポートする時に、特定のテーブルだけインポートしたい時ってある。 後は、複数のテーブルを纏めてインポートする方法を説明します。 Oracleを使ってる …


カテゴリー