描述

该语句用来根据一张源表更新一张目标表的数据,可以对目标表进行插入、更新或者删除。

格式

  1. MERGE [hint_options]
  2. INTO table_factor [opt_alias]
  3. USING table_factor [opt_alias]
  4. ON '(' expr ')'
  5. [merge_update_clause]
  6. [merge_insert_clause]
  7. merge_update_clause:
  8. WHEN MATCHED THEN UPDATE SET update_asgn_list [WHERE expr] [DELETE WHERE expr]
  9. merge_insert_clause:
  10. 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

触发更新、删除或者插入操作时的需要满足的条件

示例

示例表和数据基于以下定义:

  1. CREATE TABLE t1 (c1 INT, c2 INT);
  2. CREATE TABLE t2 (c1 INT, c2 INT);
  3. INSERT INTO t1 VALUES(0, 0);
  4. INSERT INTO t1 VALUES(1, null);
  5. INSERT INTO t1 VALUES(2, null);
  6. INSERT INTO t2 VALUES(1, 1);
  7. INSERT INTO t2 VALUES(2, 20);
  8. INSERT INTO t2 VALUES(3, 3);
  9. INSERT INTO t2 VALUES(4, 40);

根据 T2 的数据更新 T1 的数据:

  1. 如果 t1.c1 在 t2 中能够找到 c1 取值相同的行,如果 t1.c2 取值为空,那么使用 t2.c2 更新 t1.c2;如果更新之后t1.c2 >= 10,那么删除该行。

  2. 如果 t2.c1 在 t1 中找不到取值相同的行,将 t2 中的这行插入到 t1 中,且只插入满足 t2.c2 < 10 的行。

  1. obclient>MERGE INTO t1 USING t2 ON (t1.c1 = t2.c1)
  2. WHEN MATCHED THEN UPDATE SET c2 = t2.c2 where t1.c2 IS NULL DELETE
  3. WHERE t1.c2 >= 10 WHEN NOT MATCHED THEN INSERT VALUES(t2.c1, t2.c2)
  4. WHERE t2.c2 < 10;
  5. Query OK, 3 rows affected (0.02 sec)
  6. obclient>SELECT * FROM t1;
  7. +------+------+
  8. | C1 | C2 |
  9. +------+------+
  10. | 0 | 0 |
  11. | 1 | 1 |
  12. | 3 | 3 |
  13. +------+------+
  14. 3 rows in set (0.00 sec)