暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 南大通用 8a 的Merge介绍

原创 jrffffff61 2023-12-27
633

目录

Table of Contents

1 环境信息

属性 版本
操作系统 redhat7
cpu x86
GBASE 南大通用 8a 953.27.20

2 说明

GBASE 南大通用 8a支持Merge语法
示例如下:
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,…)

注意

  • 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 表哈希分布列的等值关联条件,且该关联条件
    下,哈希分布列必须是物理列的关联,不能是表达式、函数。
  • 如果主表不是hash表 会报错Can’t DO Merge when not able to build hash (redistribution) JOIN relationship between merge target and source.

3 样例

示例 :对 t1 表进行 MERGE 操作

gbase> select * from t1;
+------+-------+------------+---------+
| i    | vc    | d          | dc      |
+------+-------+------------+---------+
|    5 | wto   | 2013-02-03 | 110.210 |
|    1 | one   | 2013-02-03 |  11.210 |
|    3 | one2  | 2013-03-03 |  31.210 |
|   11 | one3  | 2013-08-03 |  41.210 |
|    2 | two   | 2013-04-03 |  12.210 |
|   33 | third | 2013-09-04 |  11.216 |
|    8 | five  | 2013-02-03 | 811.201 |
|   14 | three | 2013-07-22 | 161.218 |
| NULL | first | 2013-02-03 | 311.910 |
+------+-------+------------+---------+
9 rows in set (Elapsed: 00:00:00.01)

gbase> select * from t2;
+------+-------+------------+---------+
| i    | vc    | d          | dc      |
+------+-------+------------+---------+
|    1 | one   | 2013-02-03 |  11.200 |
|   14 | three | 2013-06-22 | 161.218 |
|    2 | two   | 2013-08-03 |  12.810 |
|   13 | one2  | 2013-09-03 |  31.010 |
|   30 | third | 2013-09-04 |  11.216 |
|  110 | one3  | 2013-08-03 |  41.210 |
+------+-------+------------+---------+
6 rows in set (Elapsed: 00:00:00.01)

gbase> MERGE INTO t1 USING t2 ON t1.i=t2.i WHEN MATCHED THEN
    -> UPDATE SET t1.vc=t2.vc WHEN NOT MATCHED THEN
    -> INSERT(t1.i,t1.vc) VALUES(t2.i,t2.vc);
Query OK, 6 rows affected (Elapsed: 00:00:00.15)
Rows matched: 6  Changed: 6  Warnings: 0

gbase> select * from t1;
+------+-------+------------+---------+
| i    | vc    | d          | dc      |
+------+-------+------------+---------+
|    3 | one2  | 2013-03-03 |  31.210 |
|    1 | one   | 2013-02-03 |  11.210 |
|    5 | wto   | 2013-02-03 | 110.210 |
|   13 | one2  | NULL       |    NULL |
|   33 | third | 2013-09-04 |  11.216 |
|    8 | five  | 2013-02-03 | 811.201 |
|    2 | two   | 2013-04-03 |  12.210 |
|   11 | one3  | 2013-08-03 |  41.210 |
|   30 | third | NULL       |    NULL |
|  110 | one3  | NULL       |    NULL |
| NULL | first | 2013-02-03 | 311.910 |
|   14 | three | 2013-07-22 | 161.218 |
+------+-------+------------+---------+
12 rows in set (Elapsed: 00:00:00.01)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论