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で他のスキーマでSQLを実行した時に、権限不足で「ORA-01031: 権限が不足しています。」のエラーになる

A5Mk2 http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/ 普段、SQL関連は、A5Mk2っていうソフトを使用しています。 今回のエラーは、自 …

no image

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

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

[ORACLE]SQLのIN句にパラメータを適用する方法

カンマ区切りの文字列を取得した理由 こないだの続きです。 日本の中心付近で仕様変更と闘うSE日記[C#]リストをカンマ区切りの文字列で出力するhttp://ht-jp.net/blog/pc/c/c- …

Oracleで「Ora-28001:the password has expired」のエラーの対処法

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

[Oracle]regexp_replaceで、改行コード・タブとかのCSV出力時に邪魔になるものを消す

通常、スペースを消したい時とかなら、replaceとかtrimとかで一括で処理してたんだけど、CSVに出力したい時に、複数の処理を纏めるのがスゲェ面倒くさかった。 それがregexp_replaceで …


カテゴリー