通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
语法
MERGE [INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
例:
基础表Base
DJH TDYT QSXZ QLR TXDZ
0001 071 10 张三 建设路
0002 051 20 王五 新华路
0003 071 30 李四 光明路
临时变化记录表(Temp)
DJH QLR TXDZ
0001 赵六 建设路
0002 王五 苏州街
0004 李武 学院路
利用提供的Merge命令我们使用如下SQL语句进行更新
merge into base p using temp np on (p.djh = np.djh)
when matched then
update set p.QLR = np.QLR , p.txdz=np.txdz
when not matched then
insert (djh,qlr,txdz) values(np.DJH, np.QLR, np.TXDZ)
结果变成
DJH TDYT QSXZ QLR TXDZ
0001 071 10 赵六 建设路
0002 051 20 王五 苏州街
0003 071 30 李四 光明路
0004 李武 学院路
在Oracle 10g中MERGE有如下一些改进:
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
1、UPDATE或INSERT子句是可选的
merge into base p using temp np on (p.djh = np.djh)
when matched then
update set p.QLR = np.QLR , p.txdz=np.txdz
如上题所示,用户可以选择只更新,不匹配的不做处理
2、UPDATE和INSERT子句可以加WHERE子句
merge into base p using temp np on (p.djh = np.djh)
when matched then
update set p.QLR = np.QLR , p.txdz=np.txdz where p.tdyt=’071’
如上题所示,用户可以在更新或者插入子句里面加入Where过滤条件,使语句变得更加灵活
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
delete只能和update配合,从而达到删除满足where条件的子句的纪录
merge into base p using temp np on (p.djh = np.djh)
when matched then
update set p.QLR = np.QLR , p.txdz=np.txdz delete where p.tdyt=’051’
如上题所示
DJH TDYT QSXZ QLR TXDZ
0004 李武 学院路
0001 071 10 赵六 建设路
0003 071 30 李四 光明路
merge into也是一个dml语句,和其他的dml语句一样需要通过rollback和commit 结束事务。