Skip to content

MERGE INTO

MERGE INTO语句可以同时实现UPDATEINSERT的功能。

说明:

目前MERGE INTO功能暂不支持UPDATESQL中带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。

    sql
    CREATE 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。

    sql
    CREATE 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
    匹配时更新,不匹配时新增。

    sql
    CREATE 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|