【実例付き】Oracle INNER JOIN UPDATEでSales部門の給与を10%増額する方法
OracleにおけるINNER JOINを使用したUPDATE文
Oracleデータベースで複数のテーブルを結合し、結合結果に基づいてデータを更新する方法はいくつかありますが、INNER JOINを使用したUPDATE文は最も一般的な方法の一つです。
INNER JOINは、共通する列を持つ複数のテーブルから、一致するレコードのみを結合する結合方法です。
UPDATE文との組み合わせ
INNER JOINとUPDATE文を組み合わせることで、結合結果に基づいて特定の列の値を更新することができます。
例
UPDATE employees
INNER JOIN departments
ON employees.department_id = departments.department_id
SET employees.salary = employees.salary * departments.salary_multiplier
WHERE departments.name = 'Sales';
この例では、employees
テーブルとdepartments
テーブルをdepartment_id
列でINNER JOINし、Sales
部門の従業員の給与をsalary_multiplier
倍に更新します。
UPDATE文の構文
UPDATE table_name
INNER JOIN joined_table_name
ON table_name.column_name = joined_table_name.column_name
SET table_name.column_name = expression
WHERE condition;
各要素の説明
table_name
: 更新するテーブル名column_name
: 結合条件となる列名expression
: 更新後の値を計算する式condition
: 更新対象となるレコードを指定する条件
注意事項
- 結合条件となる列は、両方のテーブルに存在する必要があります。
- 更新対象となるレコードが複数存在する場合、すべてのレコードが更新されます。
- WHERE句で条件を指定することで、更新対象となるレコードを絞り込むことができます。
補足
- 上記の例では、
employees
テーブルのsalary
列を更新していますが、他の列を更新することも可能です。 - Oracleには、INNER JOIN以外にも様々な結合方法があります。詳細はOracleの公式ドキュメントを参照してください。
UPDATE employees
INNER JOIN departments
ON employees.department_id = departments.department_id
SET employees.salary = employees.salary * 1.1
WHERE departments.name = 'Sales';
解説
UPDATE employees
: 更新するテーブルはemployees
テーブルです。INNER JOIN departments
:employees
テーブルとdepartments
テーブルをINNER JOINします。ON employees.department_id = departments.department_id
: 結合条件はemployees
テーブルのdepartment_id
列とdepartments
テーブルのdepartment_id
列が一致することです。SET employees.salary = employees.salary * 1.1
:employees
テーブルのsalary
列を10%増額します。WHERE departments.name = 'Sales'
:Sales
部門の従業員のみを更新対象とします。
実行結果
このコードを実行すると、Sales
部門の従業員の給与が10%増額されます。
- このコードを実行する前に、
employees
テーブルとdepartments
テーブルが存在することを確認してください。 Sales
部門が存在しない場合、このコードはエラーになります。
応用例
- 特定の条件を満たす従業員の給与を更新する
- 特定の部門の従業員の情報を更新する
- 複数のテーブルのデータを結合して更新する
OracleでINNER JOINを使用したUPDATE文以外の方法
MERGE文は、INSERT、UPDATE、DELETE操作を1つの文で実行できる便利な機能です。INNER JOINと同様、複数のテーブルを結合して処理することができます。
MERGE INTO employees
USING (
SELECT *
FROM departments
WHERE name = 'Sales'
) AS departments
ON (employees.department_id = departments.department_id)
WHEN MATCHED THEN
UPDATE SET salary = salary * 1.1;
この例では、Sales
部門の従業員の給与を10%増額するためにMERGE文を使用しています。
サブクエリを使用して、更新対象となるレコードを抽出する方法もあります。
UPDATE employees
SET salary = (
SELECT salary * 1.1
FROM departments
WHERE name = 'Sales'
AND department_id = employees.department_id
);
PL/SQLを使用して、より複雑な処理を行うこともできます。
DECLARE
cursor c_employees FOR
SELECT *
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE name = 'Sales'
);
BEGIN
FOR rec IN c_employees LOOP
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = rec.department_id;
END LOOP;
END;
各方法の比較
方法 | メリット | デメリット |
---|---|---|
INNER JOINを使用したUPDATE文 | シンプルで分かりやすい | 結合条件が複雑な場合、記述が冗長になる |
MERGE文 | 1つの文で複数の操作を実行できる | 記述が複雑になる |
サブクエリ | 柔軟性が高い | 処理速度が遅くなる場合がある |
PL/SQL | 最も複雑な処理が可能 | 記述が複雑になる |
sql oracle inner-join