■ 概要
SQLでデータを更新する際、別のテーブルの値を参照してUPDATEしたい場面は多くあります。
たとえば、マスタテーブルの最新情報でトランザクションテーブルを更新するケースなどです。
この記事では、Oracleデータベースを例に、サブクエリを使ったUPDATE文の書き方をわかりやすく解説します。
■ 基本構文
Oracleでサブクエリを用いたUPDATEを行う場合、基本的な構文は次の通りです。
ここで重要なのは、SET句の中でサブクエリを使って値を取得し、WHERE EXISTSで更新対象を限定する点です。
■ 実際の例:商品価格マスタをもとに在庫テーブルを更新
【例題】
-
PRODUCT_MASTER(商品マスタ)テーブル:-
PRODUCT_ID -
PRICE(最新の価格)
-
-
STOCK_INFO(在庫情報)テーブル:-
PRODUCT_ID -
PRICE(販売価格を更新したい)
-
【目的】
マスタの最新価格を在庫情報に反映する。
【SQL例】
■ ポイント解説
-
サブクエリは1行1列を返す必要がある
-
サブクエリが複数行を返すと
ORA-01427: single-row subquery returns more than one rowエラーになります。 -
PRODUCT_IDなどの条件で一意に絞り込みましょう。
-
-
WHERE EXISTSで更新対象を限定-
EXISTSを使わない場合、サブクエリが該当しないレコードはNULLで更新される可能性があります。 -
余計な更新を防ぐためにも、
WHERE EXISTSを併用するのが安全です。
-
-
パフォーマンス最適化のためにインデックスを確認
-
結合条件に使う列(例:
PRODUCT_ID)にはインデックスを付与すると高速化できます。
-
■ 別の書き方:MERGE文を使う方法
Oracleでは、サブクエリUPDATEの代わりにMERGE文を使っても同じことができます。
MERGE文は「更新または挿入」を同時に扱える構文で、
大量データ更新時にはこちらの方が効率的なこともあります。
■ まとめ
| 方法 | 特徴 |
|---|---|
| サブクエリを使ったUPDATE | シンプルで分かりやすい。少量データ更新に最適。 |
| MERGE文 | 更新+挿入を同時に扱える。大量データ更新に向く。 |
■ この記事のポイント
-
Oracleでサブクエリを使ったUPDATEは「単一行サブクエリ+EXISTS」で安全に実装する
-
一意性を保証できない場合は
MERGEの利用を検討 -
インデックス設計で性能を最適化
