语法格式
MERGE [INTO] [vc_name.][database_name.]table_name
USING table_reference
ON conditional_exp
[WHEN
MATCHED
THEN
UPDATE
SET
col_name1=expr1
[,
col_name2=expr2] ...
[WHEN NOT MATCHED THEN INSERT [(col_name3,...)] VALUES (expr3,...)]
使用MERGE 语法示例性语句如下:
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1057
MERGE INTO a
USING table_x b
ON (a.hash_col = b.hash_col)
WHEN MATCHED THEN UPDATE SET a.column = b.column,…
WHEN NOT MATCHED THEN INSERT (a.column,…) VALUES (b.column,…)
表5- 96 参数说明
参数名称
说
明
vc_name
vc 名,可选项。
database_name
数据库名,可选项。
table_name
表名,必须是hash 分布表,不可以是视图,可以使用别名。
table_reference
table_reference 只允许是表,可以使用别名。
conditional_exp
关联条件为哈希表的哈系列的等值条件
column
列名
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1058
注意
UPDATE 部分不支持DELETE 子句。
UPDATE 部分和INSERT 部分不支持WHERE 子句。
UPDATE 部分和INSERT 部分可以省略,但不可以同时省略,否则报语法
错误。
UPDATE 部分和INSERT 部分位置不可以颠倒。
INSERT 的VALUES 部分不允许使用MERGE 表。
UPDATE 或INSERT 中的列如果出现多次,不会报错,后指定的列生效,
但建议不要依赖于该行为,避免这样使用。
不允许一对多更新:如果MERGE 表中的一行与USING 表中的多行符合
连接条件,则报错。
MERGE INTO a 语句中,a 表必须是哈希分布表。
USING table_x b ON (a.hash_col = b.hash_col)这部分中包含JOIN 条件语
句,
JOIN 条件中必须存在a 表哈希分布列的等值关联条件,
且该关联条件
下,哈希分布列必须是物理列的关联,不能是表达式、函数。
例如:
a.hash_col = b.hash_col(合法)
ABS(a.hash_col) = b.hash_col(不合法)
a.hash_col = ABS(b.hash_col)(不合法),这个不合法是因为当前集群哈
希重分布的限制,JOIN 时均是以物理列进行哈希重分布。
WHEN MATCHED THEN UPDATE SET a.column = b.column, …语句中,
set 列(a.column)不能是hash 分布列。
WHEN
NOT
MATCHED
THEN
INSERT
(a.column, … )
VALUES
(b.column,…)语句中,
INSERT 的字段列表中,
a.column 必须出现哈希分布
列,且VALUES 中对应的列中,b.column 必须是哈希分布列,或者是经过
动态哈希重分布后的哈希分布列。
如果a 表和b 表之间JOIN 关系不是静态哈希分布JOIN 关系,则
gcluster_hash_redistribute_join_optimize 参数不能被关闭。
参与MERGE 操作的表,如果有表的主分片处于locked 状态,则无法使用
哈希重分布,因此当上例中的a 与b 不是静态哈希JOIN 关系时,会导致
MERGE 无法执行。
示例
示例1:对t1 表进行MERGE 操作。
DROP TABLE IF EXISTS t1;
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1059
CREATE
TABLE
t1(i
int,vc
varchar(20),d
date,dc
decimal(20,3))
DISTRIBUTED BY ('i');
INSERT INTO t1 VALUES(1,'one','2013-02-03',11.21);
INSERT INTO t1 VALUES (2,'two','2013-04-03',12.21);
INSERT INTO t1 VALUES (3,'one2','2013-03-03',31.21);
INSERT INTO t1 VALUES (11,'one3','2013-08-03',41.21);
INSERT INTO t1 VALUES (14,'three','2013-07-22',161.218);
INSERT INTO t1 VALUES (33,'third','2013-09-04',11.216);
INSERT INTO t1 VALUES (5,'wto','2013-02-03',110.210);
INSERT INTO t1 VALUES (null,'first','2013-02-03',311.91);
INSERT INTO t1 VALUES (8,'five','2013-02-03',811.201);
DROP TABLE IF EXISTS t2;
CREATE
TABLE
t2(i
int,vc
varchar(20),d
date,dc
decimal(30,3))
DISTRIBUTED BY ('i');
INSERT INTO t2 VALUES (1,'one','2013-02-03',11.20);
INSERT INTO t2 VALUES (2,'two','2013-08-03',12.81);
INSERT INTO t2 VALUES (13,'one2','2013-09-03',31.01);
INSERT INTO t2 VALUES (110,'one3','2013-08-03',41.21);
INSERT INTO t2 VALUES (14,'three','2013-06-22',161.218);
INSERT INTO t2 VALUES (30,'third','2013-09-04',11.216);
gbase> SELECT * FROM t1 ORDER BY i;
+------+-------+------------+---------+
| i
| vc
| d
| dc
|
+------+-------+------------+---------+
|
1 | one
| 2013-02-03 |