【SQL Server】SELECTした結果をUPDATEする方法を解説!

スポンサーリンク

SQL Serverを使用していると、「ある条件に合致するデータのみを更新したい」「他のテーブルのデータを基に特定のカラムの値を変更したい」といったケースに遭遇することがよくあります。こうした場合、単純な UPDATE 文だけでは対応できず、SELECT した結果を利用して UPDATE を実行する方法が必要になります。

こうした操作を実現するには、SQL ServerのUPDATE 文に SELECT を組み込む方法を理解する必要があります。本記事では、次の3つの主要な方法を詳しく解説します。

  1. サブクエリを使って SELECT の結果を UPDATE する方法
  2. JOIN を活用して UPDATE する方法
  3. 具体的なユースケースとパフォーマンス最適化のポイント

それぞれの方法のメリット・デメリットを比較しながら、実際に使えるSQLのサンプルコードとともに説明していきます。

サブクエリを使ってSELECT結果をUPDATEする

SQL Serverでは、UPDATE 文の SET 句にサブクエリを指定することで、SELECT の結果を利用して値を更新できます。特に、以下のようなケースで有効です。

  • 他のテーブルのデータを参照して値を更新したい
  • 同じテーブル内の別の列の値を元に更新したい
  • 特定の条件に合致するデータのみを更新したい

サブクエリを使用したUPDATEの基本構文

サブクエリを活用した UPDATE の基本構文は以下のようになります。

UPDATE テーブル名
SET 更新対象の列 = (SELECT 値 FROM 参照テーブル WHERE 条件)
WHERE 更新対象の列がある条件;

サブクエリを SET 句に埋め込むことで、SELECT した結果を UPDATE できます。ただし、SELECT の結果が1行のみになるようにすることが重要です。もし複数行が返ってしまうと、エラーになります。

他のテーブルのデータを利用して更新する

たとえば、employees テーブルの salary を、 salaries テーブルの new_salary を基に更新する場合を考えます。

UPDATE employees
SET salary = (SELECT new_salary FROM salaries WHERE salaries.emp_id = employees.emp_id)
WHERE EXISTS (SELECT 1 FROM salaries WHERE salaries.emp_id = employees.emp_id);

ポイント

  • SELECT new_salary FROM salaries WHERE salaries.emp_id = employees.emp_id の部分で、employees の各 emp_id に対する new_salary を取得
  • WHERE EXISTS を使って、更新対象の employees.emp_idsalaries に存在する場合のみ更新

このように、他のテーブルのデータを参照しながらUPDATE することができます。

同じテーブル内の別の列の値を使って更新する

同じテーブルの別のカラムを基にデータを更新するケースもあります。

例: products テーブルの discount_priceprice の90%に更新

UPDATE products
SET discount_price = (SELECT price * 0.9 FROM products AS p WHERE p.product_id = products.product_id);

この方法を使えば、特定の計算を加えた値を既存の列に反映できます。

条件を指定して部分的に更新する

特定の条件を満たすレコードのみを更新する場合、WHERE 句を適切に指定することが重要です。

例: users テーブルで、購入金額が一定額を超えたユーザーにボーナスポイントを付与

UPDATE users
SET points = points + 100
WHERE user_id IN (SELECT user_id FROM orders WHERE total_amount > 50000);

ポイント

  • IN を使用して、orders テーブルで total_amount が 50,000 を超える user_id のみ更新
  • points に100ポイントを加算

このように、特定の条件を満たすレコードのみを SELECT の結果を基に更新できます。

サブクエリを使う際の注意点

サブクエリを使って UPDATE する際には、以下のポイントに注意してください。

  1. サブクエリが複数の値を返さないようにする
    • SET 句に入るサブクエリは、1つの値(スカラー値)を返す必要がある
    • WHERE 句の条件を適切に指定し、複数行が返らないようにする
  2. パフォーマンスに注意
    • サブクエリは、更新対象の行ごとに実行される ため、データ量が多いと処理が遅くなる
    • インデックスを適切に設定し、パフォーマンスを向上させる
  3. 複雑なロジックの場合は JOIN を検討
    • サブクエリを使うと、クエリが分かりやすくなるが、JOIN を使った方が高速に処理できることがある
    • 特に、大量のデータを更新する場合は、次に紹介する JOIN を活用した UPDATE も検討すべき

JOINを使ってUPDATEする

サブクエリを使用する方法はシンプルですが、データ量が増えるとパフォーマンスが低下することがあります。そのような場合、JOIN を活用した UPDATE を行うことで、より効率的にデータを更新できます。

JOINを使用したUPDATEの基本構文

SQL Serverでは、UPDATE 文に FROM 句を追加し、JOIN を使って他のテーブルのデータを参照しながら更新できます。

UPDATE 更新対象のエイリアス
SET 更新対象のカラム = 参照テーブルのカラム
FROM 更新対象のテーブル AS 更新対象のエイリアス
JOIN 参照テーブル AS 参照エイリアス ON 結合条件
WHERE 更新条件;

この方法を使うと、サブクエリを使う場合と比べて、クエリの可読性と実行速度が向上することが多いです。

JOINを使ったUPDATEの実例

たとえば、employees テーブルの salary を、salaries テーブルの new_salary を基に更新する場合を考えます。

UPDATE e
SET e.salary = s.new_salary
FROM employees e
JOIN salaries s ON e.emp_id = s.emp_id
WHERE s.new_salary IS NOT NULL;

ポイント

  • employees テーブル(e)と salaries テーブル(s)を emp_id で結合
  • salaries テーブルの new_salaryemployees テーブルの salary に更新
  • WHERE s.new_salary IS NOT NULL を指定して、NULLの値を更新しないように制御

まとめ

SQL ServerでのUPDATE文を活用する方法には、主に2つのアプローチ—サブクエリJOIN—があります。それぞれの方法には、用途に応じたメリットとデメリットがありますが、どちらも効果的に使用することで、柔軟かつ効率的にデータの更新を行うことができます。

本記事で紹介した方法を理解し、ケースバイケースで適切なアプローチを選択することが、SQL Serverにおけるデータ更新作業を効果的に行う鍵となります。

SQL Server
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました