说明:Merge语句是Oracle 9i中新增的语法,我们在进行数据推送时,经常会遇到大量的同时进行Insert/Update的语句 ,也就是说条件匹配时,就更新数据库(Update),不匹配时,就插入(Insert)到数据库。
效率:这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE
1.insert/update用法:
设计数据库两张表:源表(Student_Message)、临时表(Student_Mid)

-- Create table:源表(Student_Message)
create table STUDENT_MESSAGE
(
  id     VARCHAR2(6),
  name   VARCHAR2(6),
  adress VARCHAR2(10)
)
tablespace EXAMPLE
  pctfree 10
  initrans 1
  maxtrans 255;
-- Add comments to the columns 
comment on column STUDENT_MESSAGE.id
  is '学生编号';
comment on column STUDENT_MESSAGE.name
  is '学生名称';
comment on column STUDENT_MESSAGE.adress
  is '家庭住址';
  
  //临时表建法同上,只需修改表名

现向数据库添加信息,如下:
源表:
Oracle之merge into 解析_Oracle
临时表:
Oracle之merge into 解析_Oracle_02
执行SQL语句:

Merge into (select * from student_mid) t1
using (select * from student_message) t2 on (t1.id = t2.id) 
WHEN MATCHED THEN
Update set t1.name = t2.name,t1.adress = t2.adress
WHEN NOT MATCHED THEN
Insert (t1.id,t1.name,t1.adress) values (t2.id,t2.name,t2.adress) 

查询临时表:
Oracle之merge into 解析_数据库_03
源表中的数据已经推送到临时表。
SQL语句具体结构:
Merge into (要导入信息的表)
using (数据源表,存放最开始的数据的表)
on (这里加匹配条件,需要多条件时,用and连接)
WHEN MATCHED THEN(匹配时修改,on条件中的不需要添加)
WHEN NOT MATCHED THEN(不匹配时添加,on条件中的需要添加)
2.关于Merge 中delete的用法:
delete没有不匹配的时候,直接跟在update后面,添加delete where+条件

Merge into (select * from student_mid) t1
using (select * from student_message) t2 on (t1.id = t2.id) 
WHEN MATCHED THEN
Update set t1.name = t2.name,t1.adress = t2.adress
--按条件删除
DELETE WHERE (t1.name = '小黑')

WHEN NOT MATCHED THEN
Insert (t1.id,t1.name,t1.adress) values (t2.id,t2.name,t2.adress) 

输出结果为:
Oracle之merge into 解析_数据库_04
数据临时表中,name = '小黑’的一列已经被更新。