Merge的用法;
oracle9i新增sql命令----merge
用途
merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件.
该语句可以在同一语句中执行两步操作,可以减少执行多条insert 和update语句。[@more@]merge是一个确定性的语句,即不会在同一条merge语句中去对同一条记录多次做修改操作。
语法
其中,merge_update_clause::=
其中,merge_insert_clause::=
关键字、参数
into 子句
在into子句中指定所要修改或者插入数据的目标表
using 子句
在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。
on 子句
在on子句中指定执行插入或者修改的满足条件。在目标表中符合条件的每一行,oracle用数据源中的相应数据修改这些行。对于不满足条件的那些行,oracle则插入数据源中相应数据。
when matched | not matched
用该子句通知oracle如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。
merge_update子句
merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
merge_insert 子句
merge_insert子句执行当不符合on子句条件时,往目标表中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
例子如下:
SQL> desc test
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
A NUMBER
B VARCHAR2(10)
C VARCHAR2(10)
SQL> desc test2
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
A NUMBER
B VARCHAR2(10)
C VARCHAR2(10)
SQL> select * from test;
A B C
---------- ---------- ----------
1 a gh
2 c gh
SQL> select * from test2;
A B C
---------- ---------- ----------
1 a a
2 b b
3 c c
SQL> merge into test using (select * from test2) t2
on (test.a =t2.a)
when matched then
update set test.b=t2.b,test.c='gh'
when not matched then
insert (test.a,test.b,test.c) values (t2.a,t2.b,t2.c)
/
3 行已合并。
SQL> select * from test
2 /
A B C
---------- ---------- ----------
1 a gh
2 b gh
3 c c
注意:不能对连接字段更新,即不能对字段a更新,否则会提示错误。
merge into test using (select * from test2) t2
on (test.a =t2.a)
when matched then
update set test.b=t2.b,test.c='gh',test.a=t2.a
when not matched then
insert (test.a,test.b,test.c) values (t2.a,t2.b,t2.c)
SQL> /
on (test.a =t2.a)
*
ERROR 位于第 2 行:
ORA-00904: "TEST"."A": 无效的标识符
---------------------------------------------------------
sys@10.188.182.183> desc t1
Name Null? Type
----------------------------------------------------- -------- ------------
A VARCHAR2(1)
B NUMBER
sys@10.188.182.183> desc t2
Name Null? Type
----------------------------------------------------- -------- ------------
A VARCHAR2(1)
B NUMBER
sys@10.188.182.183> select * from t1;
A B
- ----------
a 1
b -1
--B小于0的将更新B字段,大于等于0的则不更新B字段
sys@10.188.182.183> select * from t2;
A B
- ----------
a 2
b 2
c 2
sys@10.188.182.183> merge into t1 using (select * from t2) t2
2 on (t1.a = t2.a)
3 when matched then
4 update set t1.b=case when t1.b<0 then t2.b else t1.b end
5 when not matched then
6 insert (t1.a,t1.b) values(t2.a,t2.b);
3 rows merged.
sys@10.188.182.183> select * from t1;
A B
- ----------
a 1
b 2
c 2
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9925929/viewspace-915625/
,如需转载,请注明出处,否则将追究法律责任。