Oracle MERGE语句
MERGE语句,它可以在一个SQL语句中对一张表或一个视图同时做更新或插入操作,避免了多个INSERT、UPDATE和DELETE语句。它可以从一个或多个数据源中选择数据对目标表做更新或插入操作,你可以指定在何种条件下更新或插入目标表或视图。不可以对同一行做多次更新操作。例如:实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表。
11gR2语法如下:
MERGE[hint]INTO[schema.]{table|view}[t_alias]USING{[schema.]{table|view}|subquery}[t_alias]ON(condition)[merge_update_clause][merge_insert_clause][error_logging_clause];#merge_update_clauseWHENMATCHEDTHENUPDATESETcolumn={expr|DEFAULT}[,column={expr|DEFAULT}]...[where_clause][DELETEwhere_clause]#merge_insert_clauseWHENNOTMATCHEDTHENINSERT[(column[,column]...)]VALUES({expr|DEFAULT}[,{expr|DEFAULT}]...)[where_clause]#error_logging_clauseLOGERRORS[INTO[schema.]table][(simple_expression)][REJECTLIMIT{integer|UNLIMITED}]
使用例子说明MERGE语句的作用:
创建测试表emp_m
scott@TEST>createtableemp_masselect*fromempwherecommisnotnull;Tablecreated.scott@TEST>select*fromemp_m;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------------------------------------------------------7499ALLENSALESMAN76981981-02-2000:00:001600300307521WARDSALESMAN76981981-02-2200:00:001250500307654MARTINSALESMAN76981981-09-2800:00:0012501400307844TURNERSALESMAN76981981-09-0800:00:001500030
例子1:插入和更新操作
现在测试表emp_m中只有comm不为空的数据,现在要把在emp表而不在emp_m表中的数据插入到emp_m表中,并把emp_m表中现有的数据的comm增加10。
scott@TEST>MERGEINTOEMP_MM2USINGEMPN3ON(M.EMPNO=N.EMPNO)4WHENNOTMATCHEDTHEN5INSERT6(M.EMPNO,M.ENAME,M.JOB,M.MGR,M.HIREDATE,M.SAL,M.COMM,M.DEPTNO)7VALUES8(N.EMPNO,N.ENAME,N.JOB,N.MGR,N.HIREDATE,N.SAL,N.COMM,N.DEPTNO)9WHENMATCHEDTHEN10UPDATESETM.COMM=M.COMM+10;14rowsmerged.scott@TEST>select*fromemp_m;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------------------------------------------------------7499ALLENSALESMAN76981981-02-2000:00:001600310307521WARDSALESMAN76981981-02-2200:00:001250510307654MARTINSALESMAN76981981-09-2800:00:0012501410307844TURNERSALESMAN76981981-09-0800:00:00150010307369SMITHCLERK79021980-12-1700:00:00800207566JONESMANAGER78391981-04-0200:00:002975207698BLAKEMANAGER78391981-05-0100:00:002850307782CLARKMANAGER78391981-06-0900:00:002450107788SCOTTANALYST75661987-04-1900:00:003000207839KINGPRESIDENT1981-11-1700:00:005000107876ADAMSCLERK77881987-05-2300:00:001100207900JAMESCLERK76981981-12-0300:00:00950307902FORDANALYST75661981-12-0300:00:003000207934MILLERCLERK77821982-01-2300:00:0013001014rowsselected.
例子2:实现删除操作
从emp_m表中删除表emp中DEPTNO=30的记录。
scott@TEST>MERGEINTOEMP_MM2USING(SELECTEMPNOFROMEMPWHEREDEPTNO=30)N3ON(M.EMPNO=N.EMPNO)4WHENMATCHEDTHEN5UPDATESETM.COMM=DEFAULT6DELETEWHEREM.EMPNO=N.EMPNO;6rowsmerged.scott@TEST>select*fromemp_m;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------------------------------------------------------7369SMITHCLERK79021980-12-1700:00:00800207566JONESMANAGER78391981-04-0200:00:002975207782CLARKMANAGER78391981-06-0900:00:002450107788SCOTTANALYST75661987-04-1900:00:003000207839KINGPRESIDENT1981-11-1700:00:005000107876ADAMSCLERK77881987-05-2300:00:001100207902FORDANALYST75661981-12-0300:00:003000207934MILLERCLERK77821982-01-2300:00:00130010
使用注意事项:
不能指定一个在它上面定义了INSTEAD OF触发器的视图为目标视图。
USING子名指定源数据,可以是表、视图或子查询
UPDATE子句中的where条件可以指定目标表的条件也可以指定源表的条件
UPDATE子句中不能更新ON条件中的列,更新表时不能指定DEFAULT
UPDATE子句中指定DELETE WHERE用于删除数据。
INSERT子句中,如果INSERT后省略列名,VALUES后的列的个数必须与目标表列个数一致
INSERT子句中,可以使用WHERE条件限制插入的数据
官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。