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]ORA-12514:TNS 指定された接続識別子を解決できませんでした のエラー対処法

ORA-12514 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor …

partition by を使って、ORACLEで、グループ毎に1行だけ取得する。

グループ単位で一番小さいとか、一番大きいとかだけなら、MinやMaxを使って外部結合で対応できるんだけど、1番目2番目3番目を1列で取得しなきゃいけない状態になったので、調べて解決。 「partiti …

[ORACLE]ora-12638 資格証明の取出しに失敗しましたと表示される原因と対処法

客先で起こった内容。 状況 客先のdumpを取得するために、用意されているバッチファイルを実行した時に発生 ora-12638 資格情報の取出しに失敗しました バッチファイルの黒い画面で一瞬だけエラー …

[Oracle]長文SQLをWITH句を使って、SQLの繰り返しをまとめる

自分、WITH句アレルギーです\(^o^)/ 今でこそ、使うようになりましたが、最初は拒否反応バリバリでした。 だって、WITH句で何ができるのか良く分からなかったからです。 VIEWのように使えるか …

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

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


カテゴリー