ITPub博客

首页 > 数据库 > Oracle > Using Meger

Using Meger

原创 Oracle 作者:OmarChina 时间:2007-05-20 14:36:22 0 删除 编辑
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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 分析函數的學習
请登录后发表评论 登录
全部评论
  • 博文量
    68
  • 访问量
    1008513