返回首页

gbase数据、南大通用产品文档:GBase8c| FORD; SCOTT; ADAMS; SMITH; JONES

更新日期:2024年09月11日

20 |
7788 |

语法格式
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-04-10)
南大通用数据技术股份有限公司
1064
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
表名,必须是表,不可以是视图,可以使用别名。
table_reference
table_reference 只允许是表,可以使用别名。
conditional_exp
关联条件
column
列名

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1065
注意

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-04-10)
南大通用数据技术股份有限公司
1066
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 |

参数说明:该参数可以用来设置从Explicit 模式到Sparse 模式的默认阈值大小。
该参数属于USERSET 类型参数,请参考表15-1 中对应设置方法进行设置。
取值范围:整型,0~12 。0 表示跳过Explicit 模式,取1-12 表示在基数到达
2hll_default_log2explicit 时切换模式。
默认值:10