首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MERGE INTO 语法详解

MERGE INTO 语法详解

原创
作者头像
用户3672714
发布2025-07-19 16:51:38
发布2025-07-19 16:51:38
26200
代码可运行
举报
运行总次数:0
代码可运行

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

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

语法

代码语言:javascript
代码运行次数:0
运行
复制
MERGE INTO target_table AS targetUSING source_table AS sourceON (target.column_name = source.column_name)WHEN MATCHED THEN    UPDATE SET target.column_name = source.column_nameWHEN NOT MATCHED THEN    INSERT (target.column1, target.column2)     VALUES (source.column1, source.column2);php292 Bytes© 菜鸟-创作你的创作

关键字说明

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

例子:MERGE INTO 的常见用法

1. 基本示例

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

代码语言:javascript
代码运行次数:0
运行
复制
MERGE INTO employees AS eUSING new_employees AS neON (e.employee_id = ne.employee_id)WHEN MATCHED THEN    UPDATE SET e.name = ne.name, e.department = ne.departmentWHEN NOT MATCHED THEN    INSERT (employee_id, name, department)    VALUES (ne.employee_id, ne.name, ne.department);php285 Bytes© 菜鸟-创作你的创作

解释:

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

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

代码语言:javascript
代码运行次数:0
运行
复制
MERGE INTO employees AS eUSING new_employees AS neON (e.employee_id = ne.employee_id)WHEN NOT MATCHED THEN    DELETE;php121 Bytes© 菜鸟-创作你的创作

解释:

  • 如果目标表中的 employee_id 没有在 new_employees 表中找到匹配项,则会删除该记录。
3. 更复杂的条件匹配

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

代码语言:javascript
代码运行次数:0
运行
复制
MERGE INTO orders AS oUSING new_orders AS noON (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.quantityWHEN NOT MATCHED THEN    INSERT (order_id, product_id, quantity)    VALUES (no.order_id, no.product_id, no.quantity);php315 Bytes© 菜鸟-创作你的创作

解释:

  • 这里的匹配条件不仅是 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 类似:

代码语言:javascript
代码运行次数:0
运行
复制
MERGE INTO target_table USING source_tableON (target_table.column = source_table.column)WHEN MATCHED THEN    UPDATE SET target_table.column = source_table.columnWHEN NOT MATCHED THEN    INSERT (column1, column2) VALUES (value1, value2);php241 Bytes© 菜鸟-创作你的创作

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)时遇到具体问题?我可以进一步帮助解析或提供更详细的用法示例!

https://www.52runoob.com/archives/4098

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 基本示例
  • 2. 删除不匹配的记录
  • 3. 更复杂的条件匹配
  • 1. Oracle
  • 2. SQL Server
  • 3. PostgreSQL
  • 4. MySQL
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档