在 SQL 中,MERGE INTO 是一个用于 合并 数据的命令,通常用于将数据从一个表(源表)合并到另一个表(目标表)。它结合了 INSERTUPDATE 和 DELETE 三种操作,允许在单个 SQL 语句中根据匹配条件来插入、更新或删除记录。

MERGE INTO 在许多数据库系统中都有支持(例如,Oracle、SQL Server、PostgreSQL等)。

💡 语法

MERGE INTO target_table AS target
USING source_table AS source
ON (target.column_name = source.column_name)
WHEN MATCHED THEN
    UPDATE SET target.column_name = source.column_name
WHEN NOT MATCHED THEN
    INSERT (target.column1, target.column2) 
    VALUES (source.column1, source.column2);

📜 关键字说明

  • MERGE INTO target_table: 目标表,即你希望合并数据的表。
  • USING source_table: 源表,提供待合并数据的表。
  • ON condition: 合并条件,用于判断源表和目标表的匹配记录。常见的是通过主键或唯一标识符进行匹配。
  • WHEN MATCHED: 匹配成功时的操作。通常用于更新目标表中的记录。
  • WHEN NOT MATCHED: 如果目标表中没有匹配的记录时,执行插入操作。
  • UPDATE SET: 如果匹配,则执行更新操作。
  • INSERT: 如果没有匹配,执行插入操作。

🏅 例子:MERGE INTO 的常见用法

1. 基本示例

假设我们有两个表:employees(目标表)和 new_employees(源表)。我们希望将新员工的数据合并到现有的员工数据中:

MERGE INTO employees AS e
USING new_employees AS ne
ON (e.employee_id = ne.employee_id)
WHEN MATCHED THEN
    UPDATE SET e.name = ne.name, e.department = ne.department
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, department)
    VALUES (ne.employee_id, ne.name, ne.department);

解释:

  • 如果目标表 employees 和源表 new_employees 中有相同的 employee_id,则更新目标表的 name 和 department 字段。
  • 如果没有匹配的记录,则插入 new_employees 中的记录到 employees 表。

2. 删除不匹配的记录

假设我们要删除目标表中所有在源表中不存在的记录。可以在 MERGE INTO 中使用 DELETE 操作来实现:

MERGE INTO employees AS e
USING new_employees AS ne
ON (e.employee_id = ne.employee_id)
WHEN NOT MATCHED THEN
    DELETE;

解释:

  • 如果目标表中的 employee_id 没有在 new_employees 表中找到匹配项,则会删除该记录。

3. 更复杂的条件匹配

你还可以使用更复杂的匹配条件,例如匹配多个列:

MERGE INTO orders AS o
USING new_orders AS no
ON (o.order_id = no.order_id AND o.product_id = no.product_id)
WHEN MATCHED AND no.quantity > o.quantity THEN
    UPDATE SET o.quantity = no.quantity
WHEN NOT MATCHED THEN
    INSERT (order_id, product_id, quantity)
    VALUES (no.order_id, no.product_id, no.quantity);

解释:

  • 这里的匹配条件不仅是 order_id,还包括了 product_id,并且只有当新订单中的数量(quantity)大于原订单中的数量时才会执行更新。

🏆 在不同数据库中的支持

1. Oracle

在 Oracle 数据库中,MERGE INTO 是一个非常常见且强大的操作,通常用于将数据从一个表合并到另一个表,尤其在数据仓库中十分重要。Oracle 支持非常灵活的 MERGE INTO 语法,并可以与 复杂查询 和 函数 结合使用。

2. SQL Server

在 SQL Server 中,MERGE INTO 语法几乎与 Oracle 完全相同。SQL Server 也允许你执行类似的合并操作,来根据匹配条件插入、更新和删除数据。

3. PostgreSQL

PostgreSQL 在 13 版本后引入了 MERGE 功能,语法与 Oracle 和 SQL Server 类似:

MERGE INTO target_table USING source_table
ON (target_table.column = source_table.column)
WHEN MATCHED THEN
    UPDATE SET target_table.column = source_table.column
WHEN NOT MATCHED THEN
    INSERT (column1, column2) VALUES (value1, value2);

PostgreSQL 的 MERGE 实现也比较灵活,能够处理更多的用例。

4. MySQL

MySQL 之前并没有原生支持 MERGE INTO,但是可以通过 INSERT ... ON DUPLICATE KEY UPDATE 或者 REPLACE来实现类似的功能。MySQL 8.0 引入了 MERGE 关键字作为 视图操作,但实际的合并操作通常需要通过其他方法实现。


🎯 总结

  • MERGE INTO 是一个非常强大的 SQL 操作,可以根据匹配条件合并数据。
  • 它在实际应用中可以替代多个 SQL 语句(例如 UPDATEINSERT 和 DELETE),使得操作更加高效。
  • 不同的数据库系统对 MERGE INTO 的支持稍有差异,但基本语法和功能大同小异。
  • 适用于数据同步、增量更新等场景,特别是在数据仓库和 ETL(提取、转换、加载)过程中。

你是否在使用某个具体的数据库(如 Oracle 或 SQL Server)时遇到具体问题?我可以进一步帮助解析或提供更详细的用法示例!