MERGE的用法
2014-01-10 10:19
369 查看
在进行SQL语句编写时,当存在记录时,就更新(Update),不存在数据时,就插入(Insert)
表结构
SQL> select * from t1;
NAME MONEY
-------------------- ----------
A 10
B 20
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
1.删除t2中已存在于t1中的数据,即删除记录A
merge into t2
using t1
on(t1.name=t2.name)
when matched then
update set t2.money=t2.money --这里update必须保留,否则报错
delete where (t1.name=t2.name) --删除时只会针对目标表:t2,delete where (t1.name='A')也是对t2表中存在A记录的删除
SQL> select * from t2;
NAME MONEY
-------------------- ----------
C 20
2.将t1中不同于t2的记录添加至t2
merge into t2
using t1
on(t1.name=t2.name)
when not matched then
insert(name,money) values(t1.name,t1.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
B 20
3.将t1中所有数据插入到t2
merge into t2
using t1
on (1=0) --这里设立false条件即可
when not matched then insert(name,money) values(t1.name,t1.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
A 10
B 20
4.在插入时设立条件
merge into t2
using t1
on(t1.name=t2.name)
when matched then
update set t2.money=t2.money+t1.money
where t2.money>40; --即使匹配,插入时必须要求money>40
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
5.insert和update的联合使用,向t2表中插入没有的数据,对t2中与t1重复的数据更新
MERGE INTO t2 a
using (select name,money from t1) b
on(a.name=b.name)
when matched then update set a.money=a.money+b.money
when not matched then insert(name,money) values(b.name,b.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 40
C 20
B 20
需要注意的几点:
1.如果t1中存在多条(A,10)记录,即于t2表中的一条(A,30)记录形成多对一的关系,那么merge时会出现ORA-30926: 无法在源表中获得一组稳定的行
SQL> select * from t1;
NAME MONEY
-------------------- ----------
A 10
B 20
A 10
SQL> merge into t2
2 using t1
3 on(t1.name=t2.name)
4 when matched then update set t2.money=t1.money+t2.money
5 when not matched then insert values(t1.name,t1.money);
using t1
*
第 2 行出现错误:
ORA-30926: 无法在源表中获得一组稳定的行
表结构
SQL> select * from t1;
NAME MONEY
-------------------- ----------
A 10
B 20
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
1.删除t2中已存在于t1中的数据,即删除记录A
merge into t2
using t1
on(t1.name=t2.name)
when matched then
update set t2.money=t2.money --这里update必须保留,否则报错
delete where (t1.name=t2.name) --删除时只会针对目标表:t2,delete where (t1.name='A')也是对t2表中存在A记录的删除
SQL> select * from t2;
NAME MONEY
-------------------- ----------
C 20
2.将t1中不同于t2的记录添加至t2
merge into t2
using t1
on(t1.name=t2.name)
when not matched then
insert(name,money) values(t1.name,t1.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
B 20
3.将t1中所有数据插入到t2
merge into t2
using t1
on (1=0) --这里设立false条件即可
when not matched then insert(name,money) values(t1.name,t1.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
A 10
B 20
4.在插入时设立条件
merge into t2
using t1
on(t1.name=t2.name)
when matched then
update set t2.money=t2.money+t1.money
where t2.money>40; --即使匹配,插入时必须要求money>40
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
5.insert和update的联合使用,向t2表中插入没有的数据,对t2中与t1重复的数据更新
MERGE INTO t2 a
using (select name,money from t1) b
on(a.name=b.name)
when matched then update set a.money=a.money+b.money
when not matched then insert(name,money) values(b.name,b.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 40
C 20
B 20
需要注意的几点:
1.如果t1中存在多条(A,10)记录,即于t2表中的一条(A,30)记录形成多对一的关系,那么merge时会出现ORA-30926: 无法在源表中获得一组稳定的行
SQL> select * from t1;
NAME MONEY
-------------------- ----------
A 10
B 20
A 10
SQL> merge into t2
2 using t1
3 on(t1.name=t2.name)
4 when matched then update set t2.money=t1.money+t2.money
5 when not matched then insert values(t1.name,t1.money);
using t1
*
第 2 行出现错误:
ORA-30926: 无法在源表中获得一组稳定的行
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle 10g R2不能使用EM的问题
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- 数据库自动备份脚本
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ORACLE LATERAL-SQL-INJECTION 个人见解
- Oracle Connect to Idle Instance解决方法
- oracle sys_connect_by_path 函数 结果集连接
- Oracle捕获问题SQL解决CPU过渡消耗
- oracle dba 应该熟悉的命令
- Oracle11.2 命令行手工最简创建数据库的过程
- Oracle 数据库自动存储管理-安装配置
- 基于oracle中锁的深入理解