merge into

一、语法:

  Merge Into dest_table alais_name Using src_table alias_name On( condition )
      When Matched Then Update Set ...[where...] [Delete Where....]     注:delete的作用范围为update过的那些记录
      When Not Matched Then Insert (column_name1,...) values(column_value1,...)....[Where ....]

二、实例

1、创建测试数据 

SQL> Create Table tmp1(Id Number,Name Varchar2(20))
  2  /
Table created
SQL> Create Table tmp2(Id Number,Name Varchar2(20))
  2  /
Table created
SQL> Insert Into tmp1
  2  Select 1,'张一' From dual Union All
  3  Select 2,'张二' From dual Union All
  4  Select 3,'张三' From dual
  5  /
3 rows inserted
SQL> Insert Into tmp2
  2  Select 1,'李一' From dual Union All
  3  Select 2,'李二' From dual Union All
  4  Select 3,'李三' From dual Union All
  5  Select 4,'李四' From dual Union All
  6  Select 5,'李五' From dual
  7  /
5 rows inserted

SQL>

2、使用when matched then update ...where

SQL> Merge Into tmp1 a Using tmp2 b On(a.id=b.id)
  2  When Matched Then Update Set a.name=b.name Where b.id<=2 ;
2 rows merged

SQL> select * from tmp1;
        ID NAME
---------- --------------------
         1 李一
         2 李二
         3 张三

SQL> rollback;
Rollback complete


3、使用when not matched then insert

SQL> Merge Into tmp1 a Using tmp2 b On(a.id=b.id)
  2  When Not Matched Then  Insert(Id,Name) Values(b.id,b.name);
2 rows merged

SQL> select * from tmp1;
        ID NAME
---------- --------------------
         1 张一
         2 张二
         3 张三
         5 李五
         4 李四

SQL> rollback;
Rollback complete

4、使用when  not matched  then insert...where

SQL> Merge Into tmp1 a Using tmp2 b On(a.id=b.id)
  2  When Not Matched Then  Insert Values(b.id,b.name) Where b.id>=5;
1 row merged

SQL> select * from tmp1;
        ID NAME
---------- --------------------
         1 张一
         2 张二
         3 张三
         5 李五

SQL> rollback;
Rollback complete

5 、使用when matched then update where delete where

SQL> Merge Into tmp1 a Using tmp2 b On(a.id=b.id)
  2  When Matched Then Update Set a.name=b.name Where b.id<=2 Delete Where a.id=1;
2 rows merged

SQL> select * from tmp1;
        ID NAME
---------- --------------------
         2 李二
         3 张三



### SQL 中 `MERGE INTO` 语句的使用方法 `MERGE INTO` 是一种强大的 SQL 数据操作语言(DML),允许在一个单一的操作中完成数据的插入、更新甚至删除。其主要功能是基于条件判断来决定对目标执行何种操作。 #### 基本语法结构 以下是标准的 `MERGE INTO` 语句的基本形式: ```sql MERGE INTO target_table alias1 USING (source_table | view | subquery) alias2 ON (join_condition) WHEN MATCHED THEN UPDATE SET column1 = value1, column2 = value2, ... WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list); ``` 此语法的核心部分包括以下几个组件: - **target_table**: 被修改的目标。 - **source_table/view/subquery**: 提供数据的源、视图或者子查询。 - **join_condition**: 定义目标和源之间的连接条件。 - **WHEN MATCHED THEN UPDATE**: 当记录匹配时,执行更新操作。 - **WHEN NOT MATCHED THEN INSERT**: 当记录不匹配时,执行插入操作。 #### 实际应用案例 下面通过具体例子展示如何利用 `MERGE INTO` 将来自一个的数据同步至当前。 假设存在两个:一个是主用户信息 `users`,一个是从其他系统导入的新地址信息临时存储 `users_updates`。我们希望将新地址信息合并到现有用户的记录里;如果某些 ID 对应的用户不存在,则新增这些用户。 ```sql -- 合并逻辑实现 MERGE INTO users AS u USING users_updates AS uu ON (u.id = uu.id) WHEN MATCHED THEN -- 更新已存在的用户地址字段 UPDATE SET u.address = uu.address WHEN NOT MATCHED THEN -- 插入新的用户条目,默认姓名为空字符串"" INSERT (id, name, address) VALUES (uu.id, '', uu.address); ``` 这段脚本解释了当两者的 id 字段相等时进行更新动作,而一旦发现有未映射的关系则触发插入行为[^3]。 值得注意的是,在实际开发过程中还需要考虑更多细节问题,比如冲突解决策略、性能优化以及事务管理等方面的内容。 #### 特殊情况处理——包含 DELETE 功能扩展 除了基本的插入与更新外,还可以进一步增强该命令的功能范围以支持行级删除。例如: ```sql MERGE INTO employees e USING department d ON (e.department_id = d.id AND d.status='inactive') WHEN MATCHED THEN DELETE; ``` 这里演示了一个场景,即移除那些所属部门状态标记为 inactive 的员工记录[^2]。 ### 总结 综上所述,`MERGE INTO` 不仅简化了复杂的 ETL 流程,而且提高了批量数据维护工作的效率。然而,在运用这项技术之前应当充分理解业务需求,并仔细测试可能产生的副作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值