📜  在 Oracle SQL 的 MERGE 语句中添加条件以进行 INSERT UPDATE - SQL (1)

📅  最后修改于: 2023-12-03 15:07:45.098000             🧑  作者: Mango

在 Oracle SQL 的 MERGE 语句中添加条件以进行 INSERT UPDATE

简介

Oracle SQL提供了MERGE语句,可以将一个表的数据插入到另一个表中(INSERT)或将一个表的数据更新到另一个表中(UPDATE)。但是,在大多数情况下,我们不想将所有记录都进行更新或插入,我们需要添加条件来实现特定行的更新或插入。

语法格式

下面是 MERGE 语句的基本语法格式:

MERGE INTO target_table_name
USING source_table_name
ON merge_condition
WHEN MATCHED THEN UPDATE SET update_column_name = update_value
WHEN NOT MATCHED THEN INSERT (column1, column2, ....) VALUES (value1, value2, ....);
添加条件进行 INSERT

这里我们有一个目标表 employees 和一个源表 new_employees,源表和目标表有相同的列名和列数据类型。

在我们的例子中,我们想要把源表中年龄大于等于30岁的记录插入到目标表中。

我们可以使用以下代码来实现:

MERGE INTO employees e
USING new_employees n
ON (e.employee_id = n.employee_id)
WHEN NOT MATCHED AND n.age >= 30 THEN
  INSERT (e.employee_id, e.first_name, e.last_name, e.age)
  VALUES (n.employee_id, n.first_name, n.last_name, n.age);

这里:

  • 目标表是 employees
  • 源表是 new_employees
  • e.employee_id = n.employee_id 是合并条件。
  • WHEN NOT MATCHED AND n.age >= 30 THEN 是插入的条件。它指定添加新记录仅当源表中的记录没有匹配到目标表中的记录,且源表的 age 列大于等于30。
添加条件进行 UPDATE

这里我们有一个目标表 employees 和一个源表 new_employees,源表和目标表有相同的列名和列数据类型。

在我们的例子中,我们想要更新目标表 employees 中所有源表 new_employees 的记录。更新条件是,源表的记录已经存在于目标表中。

我们可以使用以下代码来实现:

MERGE INTO employees e
USING new_employees n
ON (e.employee_id = n.employee_id)
WHEN MATCHED THEN UPDATE 
  SET e.first_name = n.first_name,
      e.last_name = n.last_name,
      e.age = n.age
WHERE e.first_name != n.first_name or e.last_name != n.last_name or e.age != n.age;

这里:

  • 目标表是 employees
  • 源表是 new_employees
  • e.employee_id = n.employee_id 是合并条件
  • WHEN MATCHED THEN UPDATE 指定更新操作仅当源表的记录匹配目标表中的记录时
  • 设置更新值
  • WHERE e.first_name != n.first_name or e.last_name != n.last_name or e.age != n.age 确保只有源表中的记录发生变化才进行更新
结论

在Oracle SQL中使用 MERGE 语句,可以轻松将多个表中的数据合并在一起。可以根据需求添加条件,在进行 INSERT 或 UPDATE 操作前筛选所需记录。