Merge into是oracle从9i开始增加的一个语句,从merge的字面上的意思:合并,兼并不难理解merge在oracle中的含义,merge在oracle所起的作用是:如果你从以组值中有选择的更新和插入到到一张表,具体来说是:如果该表中已经匹配了这组值的某些条件,那么可以使用这组值的部分数据来更新这个表的,如果该表中无法匹配了这组值的某些条件,那么可以使用这组值的数据来为这个表新增一条数据。
无论你在使用任何DBMS,你总是难以避免的将会遇到上面提到的这种需求,如果你不使用merge语句,你将会不得不在程序中增加大段的代码,或者是在oracle用很长的代码来实现。好在现在我们有了merge,可以帮我们省下很多时间。
好了废话少说:
Merge 的基本语法是这样的
Merge into table[alias]
Using table or sql query [alias]
On condition
When matched then
Update set ….
When not matched then
Insert values…
以上是merge的基本语法,其中alias是为表或者查询写的别名
如果你看着空洞的语法觉得头很痛,看下面的例子吧
首先我们创建两个表
create table test1(id int,name varchar(20));
create table test2(id int,name varchar(20))
然后随意插入几行数据
insert into test1 values(1,’hi’);
insert into test1 values(2,’hello’);
insert into test2 values(2,’你好’);
insert into test2 values(3,’morning’);
下面我们要使用了merge了,将test2中的数据有选择地转移或者更新到test1中
如果你运行了下下面的merge语句,你将会的到一个错误,这是因为oracle规定在merge语句中不能更新作为连接的列,也就是on后面的那些列
merge into test1 t1
using test2 t2
on (t1.id = t2.id)
when matched then
update set t1.id = t2.id
when not matched then
insert values(t2.id,t2.name);
所以将会得到如下的错误,虽然这个错误翻译的并不怎么样,甚至带有明显的误导
on (t1.id = t2.id)
*
ERROR 位于第 3 行:
ORA-00904: “T1″.”ID”: 无效的标识符
好了,知错就改,我们再来运行下面的merge语句。
merge into test1 t1
using test2 t2
on (t1.id = t2.id)
when matched then
update set t1.name = t2.name
when not matched then
insert values(t2.id,t2.name)
成功执行了,我们来验证一下。
select * from test1;
ID NAME
—— —————-
1 hi
2 你好
3 morning
至此,你已经掌握了merge语句中的大部分。但我们还要提醒一些特殊情况。
如果我们再向test2中增加一条语句
insert into test2 values(2,’早’)
再执行我们以已经成功执行过的merge语句,将会遇到下面的错误
SQL> merge into test1 t1
2 using test2 t2
3 on (t1.id = t2.id)
4 when matched then
5 update set t1.name = t2.name
6 when not matched then
7 insert values(t2.id,t2.name)
8 ;
using test2 t2
*
ERROR 位于第 2 行:
ORA-30926: 无法在源表中获得一组稳定的行
这是因为当执行到t1.id = t2.id =2时,test2表中对应了两条记录,无法进行更新或者插入。所以就出错了。所以你应该明白oracle中的merge语句应该保证on中的条件的唯一性,
另外一点需要说明的是using关键字后面可以接表,当然也可以接其他的select语句做出来的一个类视图,oracle中的这种结构,我们在前面已经介绍多次,在此不作介绍。
发表评论
-
oracle中死锁的处理
2010-05-25 12:16 7951、临时表 WITH TMPTABLE AS (sel ... -
oracle中char(20)转换成varchar2(10)
2009-11-03 14:14 4813说明:mw_app.a表中字段b ,类型char(20),原来 ... -
给表或表中字段注释
2009-10-29 11:00 8241、给表添加注释 comment on table MW_S ... -
Oracle中将一个表中的字段值复制到另一个表的字段中
2009-10-22 19:29 5550说明: 1、mw_app.mwt_ud_pd_sb_r ... -
Oracle一个简单的存储过程
2009-09-21 18:21 888Oracle一个简单的存储过程 /*定义过程参数*/ ... -
Oracle 创建序列号
2009-09-15 12:56 3014Oracle 创建序列号 1. 创建序列号里各参数 ... -
Oracle 多行转列函数
2009-09-13 20:36 4939Oracle中使用WMSYS.WM_CONCAT函数进行多行转 ... -
Oracle 单行函数
2009-09-13 20:15 1077三、Oracle 单行函数 ... -
Oracle 限制选择行
2009-09-13 20:11 771二、Oracle 限制选择行 ... -
Oracle选择行
2009-09-13 20:08 1004Oracle选择行 一、选择行 1. 简单的SELE ... -
Oracle SQL性能优化
2009-09-13 17:49 576Oracle SQL语句的性能优化 (1)选择最 ...
相关推荐
oracle使用 merge 更新或插入数据(总结)
在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...
在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...
此外,`MERGE` 语句还可以结合 `DELETE` 功能,允许在同一步骤中更新现有记录的同时删除旧记录。 #### 五、示例分析 以下是一个具体的例子,通过该示例我们可以更深入地理解 `MERGE` 语句的工作机制。 1. **创建...
如果我们只想将`NEWPRODUCTS`表中没有出现在`PRODUCTS`表中的新数据插入,而不做更新,则可以省略`UPDATE`子句,仅保留`INSERT`子句。 ```sql MERGE INTO PRODUCTS p USING NEWPRODUCTS np ON (p.PRODUCT_ID =...
在实际应用中,Merge Into 语句可以用来实现各种数据同步和数据migration的任务,例如用 B 表来更新 A 表中的数据,如果 A 表中没有,则把 B 表的数据插入 A 表。Merge Into 语句可以帮助我们简化数据处理的过程,...
- 使用`MERGE INTO`语句,根据业务逻辑,将导入的数据与原表进行合并,完成数据的更新和插入。 在实际操作中,我们还需要考虑错误处理、性能优化等问题。例如,为提高数据导入速度,可以使用并行加载选项;为了保证...
方法一(推荐): UPDATE 表2 ...尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据的范围。 方法二: MERGE INTO 表2 USING 表1 ON (表2.A = 表1.A) -- 条件是 A 相同 WHEN MATCHED THEN UP
描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为灵活和高效的数据管理方式。在...
Oracle Merge 函数是一种强大的数据操作语句,用于从一个表中选择一些数据更新或者插入到另一个表中。Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge ...
在Oracle数据库管理中,`MERGE`语句是一种强大的功能,它允许用户根据源表中的数据更新目标表,同时也可以向目标表中插入新的记录。这使得`MERGE`成为处理大量数据时的一个高效工具,特别是在需要同步两个数据集的...
在提供的示例中,我们看到如何使用MERGE语句来更新或插入数据到`t_config_related`表。假设我们要根据某个序列号(seq)来更新或插入数据: ```sql MERGE INTO t_config_related A1 USING (select '97547758-6f85-...
8. **统计数据的准确性**:对数据频繁更新的表应该定期进行分析,以便Oracle能够收集到准确的统计数据,从而做出正确的执行计划选择。 9. **索引列的选择性**:如果索引列的选择性不高,即包含的唯一值很少,Oracle...
Oracle中的`MERGE INTO`语句是一种强大的数据操作工具,它结合了`UPDATE`和`INSERT`的功能,可以根据源表(source-table)和目标表(target-table)之间的匹配条件进行数据的更新或插入。这个语句的主要目的是提高...
分区是 Oracle 中的一种优化技术,可以将大型表分割成多个小表,提高查询速度和数据处理效率。Oracle 建议,当表大小超过 2G 或者表有历史数据和当前数据之分时,考虑使用分区。 分区的种类有多种,包括范围分区、...
### Oracle 数据表分区详解 #### 一、分区表理论知识 Oracle 提供了表分区功能以支持非常大型的数据库(VLDB)。通过分区技术,可以根据指定的分区键将数据分散到不同的物理位置,从而实现更高效的数据管理和查询...
Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...