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-28001:the password has expired」のエラーの対処法

正直、自分で見たときに何が起こったのかわかりませんでしたw だって、初めて見るエラーだったし・・・ ということで、調べてみたら、パスワードの有効期限らしいですね。 対処法も簡単なので、サクッと対処法を …

[ORACLE]指定日付の月末を取得する

LAST_DAYで月末を取得する LAST_DAYを使います。 実際、仕様で、ある項目には月末を入力させるとか、翌月1日を指定するとかいうのが指定されたりします。 細かく計算してると正直面倒くさいです …

続) 何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

この土日は休日出勤でした・・・ そして、昨日・・・新しい現象が発生しました。 日本の中心付近で仕様変更と闘うSE日記日本の中心付近で仕様変更と闘うSE日記http://ht-jp.net/blog/p …

no image

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

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

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

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


カテゴリー