oracle merge into insert delete
时间: 2025-01-10 10:45:07 浏览: 98
### Oracle `MERGE INTO` 语句概述
在Oracle数据库中,`MERGE INTO`语句允许在一个原子操作中执行插入、更新甚至有条件地删除记录。此特性自Oracle 9i版本起被引入[^3]。
### 使用 `MERGE INTO` 进行插入和删除的操作指南
#### 基本语法结构
```sql
MERGE INTO target_table t
USING source_table s
ON (join_condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
DELETE WHERE condition
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (value_list);
```
- **target_table**: 被合并的目标表。
- **source_table**: 提供数据用于比较并可能触发插入或更新动作的数据源表。
- **join_condition**: 定义目标表与源表之间匹配关系的条件表达式。
- **UPDATE SET...**: 当找到匹配项时应用的列赋值列表。
- **DELETE WHERE...**: 可选子句,在满足特定条件下移除已存在的行[^2]。
- **INSERT (...)**: 如果未发现任何匹配,则向目标表添加新纪录。
请注意,并不是所有的数据库版本都支持`DELETE`选项;这取决于具体的Oracle发行版及其配置情况。
#### 实际案例展示
假设存在两个表格:`employees`作为目标表以及临时加载员工变动信息的`new_employees`作为源表。下面的例子展示了如何利用`MERGE INTO`来同步这两张表中的数据:
```sql
MERGE INTO employees e
USING new_employees ne ON (e.employee_id = ne.employee_id)
WHEN MATCHED THEN
UPDATE SET salary = ne.salary,
department_id = ne.department_id
DELETE WHERE ne.status = 'terminated'
WHEN NOT MATCHED THEN
INSERT (employee_id, first_name, last_name, email, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (ne.employee_id, ne.first_name, ne.last_name, ne.email, sysdate, ne.job_id, ne.salary, ne.commission_pct, ne.manager_id, ne.department_id);
```
这段SQL脚本会检查每一个来自`new_employees`的新条目是否已经在`employees`里有对应的记录。如果有对应记录并且状态标记为终止(`'terminated'`)则会被删除;如果只是简单的属性变化(比如薪水调整),那么就只做相应的字段更新。对于那些完全不存在于现有雇员名单上的新人,则直接加入到正式人员编制之中[^1]。
阅读全文
相关推荐

















