MERGE INTO
MERGE INTO
语句可以同时实现UPDATE
和INSERT
的功能。
说明:
目前
MERGE INTO
功能暂不支持UPDATE
SQL中带DELETE
的操作。
主要语法结构
语法格式
WHEN MATCHED THEN UPDATE
:该子句指定目标表的新列值。如果ON子句的条件为真,则执行此更新。
sql
MERGE INTO [ schema. ] { table | view } [ t_alias ]
USING { [ schema. ] { table | view } | subquery } [ t_alias ]
ON (bool_expr)
WHEN MATCHED THEN
UPDATE SET
column = { expr | DEFAULT },
...
[WHERE bool_expr]
[DELETE WHERE bool_expr]
WHEN NOT MATCHED THEN INSERT
:如果ON子句的条件为false,则该子句指定要插入到目标表列中的值。如果合并插入关键字之后省略列,则目标表中的列数必须与values子句中的字段数相匹配。
sql
MERGE INTO [ schema. ] { table | view } [ t_alias ]
USING { [ schema. ] { table | view } | subquery } [ t_alias ]
ON (bool_expr)
WHEN NOT MATCHED THEN
INSERT insert_merge
[WHERE bool_expr]
同时判断:
sql
MERGE INTO [ schema. ] { table | view } [ t_alias ]
USING { [ schema. ] { table | view } | subquery } [ t_alias ]
ON (bool_expr)
WHEN MATCHED THEN
UPDATE SET
column = { expr | DEFAULT },
...
[WHERE bool_expr]
[DELETE WHERE bool_expr]
WHEN NOT MATCHED THEN
INSERT insert_merge
[WHERE bool_expr]
参数说明
schema
:可选,表或视图所在的模式名。table | view
:目标表或视图的名称。t_alias
:可选,为目标表或视图指定别名。bool_expr
:条件表达式。USING { [schema.] { table | view } | subquery } [t_alias]
:指定源表、视图或子查询及其别名。
插入值insert_merge
语法格式
sql
insert_merge::=
VALUES insert_values
| DEFAULT VALUES
| (columnList2) VALUES insert_values
insert_values::=
(target_list)
| insert_values (target_list)
| insert_values,(target_list)
参数说明
VALUES insert_values
:插入特定值。insert_values
:(target_list)
: 一组值。insert_values (target_list)
: 多组值。insert_values,(target_list)
: 多组值,用逗号分隔。
DEFAULT VALUES
:插入所有列的默认值。(columnList2) VALUES insert_values
:指定要插入的列及其值。columnList2
:列名列表。
示例
示例1
只INSERT。sqlCREATE TABLE a_merge(id NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER); CREATE TABLE b_merge(id NUMBER NOT NULL,aid NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER,city VARCHAR2(12)); INSERT INTO a_merge VALUES(1,'liuwei',20)(2,'zhangbin',21)(3,'fuguo',20); INSERT INTO b_merge VALUES(1,2,'zhangbin',30,'吉林')(2,4,'yihe',33,'黑龙江')(3,3,'fuguo',44,'山东'); MERGE INTO a_merge a USING (SELECT b.aid,b.name,b.year FROM b_merge b) c ON(a.id=c.aid) WHEN NOT MATCHED THEN INSERT(a.id,a.name,a.year) VALUES(c.aid,c.name,c.year); SELECT * FROM a_merge; ID | NAME | YEAR | ------------------------------------------------------------------------------ 1| liuwei| 20| 2| zhangbin| 21| 3| fuguo| 20| 4| yihe| 33|
示例2
只UPDATE。sqlCREATE TABLE a_merge(id NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER); CREATE TABLE b_merge(id NUMBER NOT NULL,aid NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER,city VARCHAR2(12)); INSERT INTO a_merge VALUES(1,'LIUWEI',20)(2,'ZHANGBIN',21)(3,'FUGUO',20); INSERT INTO b_merge VALUES(1,2,'ZHANGBIN',30,'吉林')(2,4,'YIHE',33,'黑龙江')(3,3,'FUGUO',44,'山东'); MERGE INTO a_merge a USING (SELECT b.aid,b.name,b.year FROM b_merge b) c ON(a_merge.id=c.aid) WHEN MATCHED THEN UPDATE SET a_merge.year=c.year; SELECT * FROM a_merge; ID | NAME | YEAR | ------------------------------------------------------------------------------ 1| LIUWEI| 20| 2| ZHANGBIN| 30| 3| FUGUO| 44|
示例3
匹配时更新,不匹配时新增。sqlCREATE TABLE a_merge(id NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER); CREATE TABLE b_merge(id NUMBER NOT NULL,aid NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER,city VARCHAR2(12)); INSERT INTO a_merge VALUES(1,'LIUWEI',80)(2,'ZHANGBIN',30)(3,'FUGUO',20)(4,'YIHE',33)(5,'TIANTIAN',23); INSERT INTO b_merge VALUES(1,2,'ZHANGBIN',70,'吉林')(2,4,'YIHE++',33,'黑龙江')(3,3,'FUGUO',44,'山东')(4,1,'LIUWEI++',80,'江西')(5,5,'TIANTIAN',23,'河南')(6,6,'NINGQIN',23,'江西')(7,7,'BING',24,'吉安'); MERGE INTO a_merge a USING (SELECT b.aid,b.name,b.year,b.city FROM b_merge b) c ON(a_merge.id=c.aid) WHEN MATCHED THEN UPDATE SET a.name=c.name WHEN NOT MATCHED THEN INSERT(a.id,a.name,a.year) VALUES(c.aid,c.name,c.year); SELECT * FROM a_merge; ID | NAME | YEAR | ------------------------------------------------------------------------------ 1| LIUWEI++| 80| 2| ZHANGBIN| 30| 3| FUGUO| 20| 4| YIHE++| 33| 5| TIANTIAN| 23| 6| NINGQIN| 23| 7| BING| 24|