oracle MERGE 新增或更新

// 创建表
create table ORACLE_TEST(  
  ID   number(10)   primary key,  
  ROT  varchar2(20) not null,  
  SOG  varchar2(4)
);  

// MERGE INTO语句
MERGE INTO ORACLE_TEST dest USING (
	SELECT
		'125891' AS ID,
		'11223344' AS ROT,
		'99887766' AS SOG
	FROM
		dual
) src ON (dest.ID = src.ID)
WHEN MATCHED THEN
	UPDATE
SET 
 dest.ROT = src.ROT,
 dest.SOG = src.SOG
WHEN NOT MATCHED THEN
	INSERT (ID, ROT, SOG)
VALUES
	(src.ID, src.ROT, src.SOG)

 

### OracleMERGE INTO 的语法及使用示例 #### 1. 基本概念 `MERGE INTO` 是一种用于在同一查询中执行 `UPDATE` 和 `INSERT` 操作的 SQL 语句。它最早由 Oracle 数据库在版本 9i 中引入[^2],允许开发者基于特定条件对目标表进行更新插入操作。 #### 2. 语法结构 以下是 `MERGE INTO` 的基本语法: ```sql MERGE INTO target_table t USING source_table s ON (join_condition) WHEN MATCHED THEN UPDATE SET t.column1 = s.column1, ..., t.columnN = s.columnN WHERE update_conditions WHEN NOT MATCHED THEN INSERT (t.column1, ..., t.columnN) VALUES (s.column1, ..., s.columnN); ``` - **target_table**: 需要被更新插入的目标表。 - **source_table**: 提供数据源的表。 - **join_condition**: 定义如何匹配目标表和源表之间的记录。 - **WHEN MATCHED THEN**: 当满足连接条件时触发此部分逻辑,通常用来更新现有记录。 - **WHEN NOT MATCHED THEN**: 如果未找到匹配项,则会在此处插入新记录。 #### 3. 使用示例 ##### 示例一:简单合并操作 假设有一个员工表 `employees` 和一个临时表 `temp_employees`,我们希望同步两个表的数据。如果 `temp_employees` 中存在与 `employees` 表相同的记录(通过 `id` 判断),则更新该记录;否则插入一条新的记录。 ```sql MERGE INTO employees e USING temp_employees te ON (e.id = te.id) WHEN MATCHED THEN UPDATE SET e.name = te.name, e.salary = te.salary WHEN NOT MATCHED THEN INSERT (id, name, salary) VALUES (te.id, te.name, te.salary); ``` 上述代码实现了以下功能: - 对于 `employees` 表中存在的记录,将其名称 (`name`) 和薪资 (`salary`) 更新为来自 `temp_employees` 的值。 - 若某条记录不存在于 `employees` 表中,则从 `temp_employees` 插入这条记录到目标表中。 ##### 示例二:带额外过滤条件的复杂合并 有时可能需要更复杂的业务逻辑来控制何时更新插入数据。例如,在某些情况下仅当薪资变化超过一定阈值时才更新记录。 ```sql MERGE INTO employees e USING temp_employees te ON (e.id = te.id AND ABS(e.salary - te.salary) > 500) WHEN MATCHED THEN UPDATE SET e.salary = te.salary WHERE e.department_id = 'HR' WHEN NOT MATCHED THEN INSERT (id, name, department_id, salary) VALUES (te.id, te.name, te.department_id, te.salary); ``` 这段脚本增加了以下几个特性: - 只有当薪资差异大于 500 并且部门为 HR 时才会更新记录。 - 新增记录同样遵循这些规则。 #### 4. 优缺点分析 ##### 优点 - 减少了多次扫描数据库的需求,从而提高了性能效率[^1]。 - 单次调用即可完成多种 DML 操作,简化了程序设计流程。 ##### 缺点 - 查询较为复杂,初学者可能会觉得难以理解和维护。 - 不适合处理大量并发事务环境下的冲突管理问题。 #### 5. 注意事项 - 确保 `ON` 子句中的条件能够唯一标识每条记录,否则可能导致意外的结果。 - 测试阶段应充分验证各种边界情况以确认行为符合预期。 #### 6. MySQL 替代方案 由于 MySQL 自身不支持标准形式的 `MERGE INTO` 语法,因此可以通过组合其他命令实现相似效果。具体方法包括但不限于利用 `REPLACE INTO` 者先删除再插入的方式模拟这一过程[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值