「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

■ 概要

SQLでデータを更新する際、別のテーブルの値を参照してUPDATEしたい場面は多くあります。
たとえば、マスタテーブルの最新情報でトランザクションテーブルを更新するケースなどです。

この記事では、Oracleデータベースを例に、サブクエリを使ったUPDATE文の書き方をわかりやすく解説します。


■ 基本構文

Oracleでサブクエリを用いたUPDATEを行う場合、基本的な構文は次の通りです。

ここで重要なのは、
SET句の中でサブクエリを使って値を取得し、
WHERE EXISTSで更新対象を限定する点です。


■ 実際の例:商品価格マスタをもとに在庫テーブルを更新

【例題】

  • PRODUCT_MASTER(商品マスタ)テーブル:

    • PRODUCT_ID

    • PRICE(最新の価格)

  • STOCK_INFO(在庫情報)テーブル:

    • PRODUCT_ID

    • PRICE(販売価格を更新したい)

【目的】

マスタの最新価格を在庫情報に反映する。

【SQL例】


■ ポイント解説

  1. サブクエリは1行1列を返す必要がある

    • サブクエリが複数行を返すと ORA-01427: single-row subquery returns more than one row エラーになります。

    • PRODUCT_IDなどの条件で一意に絞り込みましょう。

  2. WHERE EXISTSで更新対象を限定

    • EXISTSを使わない場合、サブクエリが該当しないレコードは NULL で更新される可能性があります。

    • 余計な更新を防ぐためにも、WHERE EXISTSを併用するのが安全です。

  3. パフォーマンス最適化のためにインデックスを確認

    • 結合条件に使う列(例:PRODUCT_ID)にはインデックスを付与すると高速化できます。


■ 別の書き方:MERGE文を使う方法

Oracleでは、サブクエリUPDATEの代わりにMERGE文を使っても同じことができます。

MERGE文は「更新または挿入」を同時に扱える構文で、
大量データ更新時にはこちらの方が効率的なこともあります。


■ まとめ

方法特徴
サブクエリを使ったUPDATEシンプルで分かりやすい。少量データ更新に最適。
MERGE文更新+挿入を同時に扱える。大量データ更新に向く。

■ この記事のポイント

  • Oracleでサブクエリを使ったUPDATEは「単一行サブクエリ+EXISTS」で安全に実装する

  • 一意性を保証できない場合は MERGE の利用を検討

  • インデックス設計で性能を最適化

Ads by Google

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
0
あなたの考えが大好きです、コメントしてください。x