用途:
merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件。
该语句可以在同一语句中执行两步操作,可以减少执行多条insert 和update语句。
merge是一个确定性的语句,即不会在同一条merge语句中去对同一条记录多次做修改操作。
语法:
1.into 子句
在into子句中指定所要修改或者插入数据的目标表
2.using 子句
在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。
3.on 子句
在on子句中指定执行插入或者修改的满足条件。在目标表中符合条件的每一行,oracle用数据源中的相应数据修改这些行。对于不满足条件的那些行,oracle则插入数据源中相应数据。
4.when matched | not matched
用该子句通知oracle如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。
5.merge_update子句
merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
6.merge_insert 子句
merge_insert子句执行当不符合on子句条件时,往目标表中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。
。限制:当修改一个视图时,不能指定一个default值
merge into bonuses d
using (select employee_id, salary, department_id from employees
where department_id = 80) s
on (d.employee_id = s.employee_id)
when matched then update set d.bonus = d.bonus + s.salary*.01
when not matched then insert (d.employee_id, d.bonus)
values (s.employee_id, s.salary*0.01)
------------------------->>简单案例:
------------------------------------- 创建测试表--TEST1 ----------------------------------
SQL> CREATE TABLE TEST1(
2 USERID NUMBER,
3 ID NUMBER);
Table created
--------------------------------------------------------------------------------------------------------------
---------------------------------- 填充测试数据 -------------------------------
SQL> begin
2 for i in 200..230 loop
3 insert into test1 values(i,(i+100)/10);
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed
SQL> select * from test1;
USERID ID
---------- ----------
200 30
201 30.1
202 30.2
203 30.3
204 30.4
205 30.5
206 30.6
207 30.7
208 30.8
209 30.9
210 31
211 31.1
212 31.2
213 31.3
214 31.4
215 31.5
216 31.6
217 31.7
218 31.8
219 31.9
USERID ID
---------- ----------
220 32
221 32.1
222 32.2
223 32.3
224 32.4
225 32.5
226 32.6
227 32.7
228 32.8
229 32.9
230 33
31 rows selected
--------------------------------------------------------------------------------------------------------------
----------------------------- 创建测试表--TEST2 、TEST3 --------------------------------
SQL> create table test2
2 as
3 select userid,trunc(id,-1) id2 from test1 where length(id)=4;
Table created
SQL> select * from test2;
USERID ID2
---------- ----------
201 30
202 30
203 30
204 30
205 30
206 30
207 30
208 30
209 30
211 30
212 30
213 30
214 30
215 30
216 30
217 30
218 30
219 30
221 30
222 30
USERID ID2
---------- ----------
223 30
224 30
225 30
226 30
227 30
228 30
229 30
27 rows selected
SQL> create table test3
2 as
3 select userid,id id3 from test1 where length(id) <> 4;
Table created
SQL> select * from test3;
USERID ID3
---------- ----------
200 30
210 31
220 32
230 33
--------------------------------------------------------------------------------------------------------------
----------------------------------- 测试MERGE INTO -----------------------------------
SQL> MERGE INTO test3 t
2 USING (SELECT userid,id2 FROM test2 WHERE id2=30) tw
3 ON (t.userid = tw.userid)
4 WHEN MATCHED THEN UPDATE SET t.id3=tw.id2
5 WHEN NOT MATCHED THEN INSERT VALUES(tw.userid,tw.id2);
Done
SQL> SELECT * FROM test3;
USERID ID3
---------- ----------
200 30
210 31
220 32
230 33
202 30
201 30
204 30
203 30
228 30
217 30
209 30
221 30
219 30
227 30
205 30
212 30
225 30
208 30
222 30
226 30
USERID ID3
---------- ----------
215 30
218 30
214 30
216 30
211 30
224 30
213 30
223 30
206 30
207 30
229 30
31 rows selected
SQL>
--测试完成,我们看到,test2表中的数据全部加到test3表中。
PS:
on(condition_clause)这里的条件句中,可以使用=,>,< 等比较运算符。------------------------------------- The End -------------------------------------------
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29119536/viewspace-1562385/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29119536/viewspace-1562385/