描述
该语句用来根据一张源表更新一张目标表的数据,可以对目标表进行插入、更新或者删除。
格式
MERGE [hint_options]
INTO table_factor [opt_alias]
USING table_factor [opt_alias]
ON '(' expr ')'
[merge_update_clause]
[merge_insert_clause]
merge_update_clause:
WHEN MATCHED THEN UPDATE SET update_asgn_list [WHERE expr] [DELETE WHERE expr]
merge_insert_clause:
WHEN NOT MATCHED THEN INSERT opt_insert_columns VALUES '(' insert_vals ')' [WHERE expr]
参数解释
参数 | 描述 |
---|---|
hint_options | 指定 hint 选项 |
table_factor | 指定源表和目标表的表名 |
ON expr | 源表和目标表的连接条件 |
update_asgn_list | 更新语句的赋值操作 |
WHERE expr | 触发更新、删除或者插入操作时的需要满足的条件 |
示例
示例表和数据基于以下定义:
create table t1 (c1 int, c2 int);
create table t2 (c1 int, c2 int);
insert into t1 values (0, 0);
insert into t1 values (1, null);
insert into t1 values (2, null);
insert into t2 values (1, 1);
insert into t2 values (2, 20);
insert into t2 values (3, 3);
insert into t2 values (4, 40);
根据 T2 的数据更新 T1 的数据,
如果 t1.c1 在 t2 中能够找到 c1 取值相同的行
如果 t1.c2 取值为空,那么使用 t2.c2 更新 t1.c2
如果更新之后,t1.c2 >= 0,那么删除这行
如果 t2.c1 在 t1 中找不到取值相同的行
将 t2 中的这行插入到 t1 中,且只插入满足 t2.c2 < 10 的行
merge into t1 using t2 on (t1.c1 = t2.c1)
when matched then update set c2 = t2.c2 where t1.c2 is null delete where t1.c2 >= 10
when not matched then insert values (t2.c1, t2.c2) where t2.c2 < 10;
Query OK, 3 rows affected (0.02 sec)
select * from t1;
+------+------+
| C1 | C2 |
+------+------+
| 0 | 0 |
| 1 | 1 |
| 3 | 3 |
+------+------+