SQL Server 2008 以降で使える MERGE ステートメント
SQL 結合を使用して、複数のテーブルからデータを抽出して更新するクエリを作成できます。これは、関連するデータが複数のテーブルに分散している場合に便利です。
基本構文
UPDATE table_name
SET column_name = new_value
[FROM table_name]
[JOIN table_name ON join_condition]
WHERE update_condition;
例
顧客テーブルと注文テーブルを結合して、注文ステータスを更新する
UPDATE orders
SET order_status = 'Shipped'
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.country = 'Japan';
このクエリは、以下の処理を実行します。
orders
テーブルとcustomers
テーブルをcustomer_id
で結合します。customers.country
列がJapan
であるすべての注文のorder_status
列をShipped
に更新します。
UPDATE employees
SET salary = salary * 1.1
FROM employees
JOIN salaries ON employees.employee_id = salaries.employee_id
WHERE employees.department = 'Sales';
employees
テーブルとsalaries
テーブルをemployee_id
で結合します。employees.department
列がSales
であるすべての従業員の給与を 10% 増額します。
結合の種類
- INNER JOIN: 両方のテーブルから一致するレコードのみを抽出します。
- LEFT JOIN: 左側のテーブルのすべてのレコードを抽出します。一致するレコードのみ右側のテーブルから抽出します。
注意事項
- 結合条件を正しく指定しないと、意図しないデータが更新される可能性があります。
- 更新する列を明確に指定する必要があります。
- WHERE 句を使用して、更新対象のレコードを絞り込むことができます。
顧客テーブルと注文テーブルを結合して、注文ステータスを更新する
USE AdventureWorks2019;
GO
UPDATE orders
SET order_status = 'Shipped'
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.country = 'Japan';
GO
SELECT *
FROM orders
WHERE order_status = 'Shipped';
- 更新された注文情報を表示します。
従業員テーブルと給与テーブルを結合して、給与を更新する
USE AdventureWorks2019;
GO
UPDATE employees
SET salary = salary * 1.1
FROM employees
JOIN salaries ON employees.employee_id = salaries.employee_id
WHERE employees.department = 'Sales';
GO
SELECT *
FROM employees
WHERE department = 'Sales';
このコードは、AdventureWorks2019
データベースの employees
テーブルと salaries
テーブルを使用して、以下の処理を実行します。
SQL 結合を使用した更新クエリ以外の方法
UPDATE orders
SET order_status = 'Shipped'
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE country = 'Japan'
);
このクエリは、customers
テーブルから country
列が Japan
である顧客の customer_id
を取得し、orders
テーブルの order_status
列を更新します。
MERGE ステートメントを使用する (SQL Server 2008 以降)
MERGE orders AS o
USING (
SELECT customer_id, country
FROM customers
) AS c
ON o.customer_id = c.customer_id
WHEN MATCHED THEN
UPDATE SET o.order_status = 'Shipped'
WHERE c.country = 'Japan';
方法の比較
方法 | 利点 | 欠点 |
---|---|---|
結合を使用する | シンプルで分かりやすい | 複雑な結合条件の場合、見通しが悪くなる可能性がある |
サブクエリを使用する | 複雑な条件を指定しやすい | サブクエリが複雑になると、処理速度が遅くなる可能性がある |
MERGE ステートメントを使用する (SQL Server 2008 以降) | シンプルで処理速度が速い | 古いバージョンの SQL Server では使用できない |
- シンプルな更新の場合は、結合を使用するのが一般的です。
- 複雑な条件を指定する必要がある場合は、サブクエリを使用するのが便利です。
- SQL Server 2008 以降を使用している場合は、MERGE ステートメントを使用するのが効率的です。
sql sql-server t-sql