(42000): (GBA-02SC-1001) Can‘t DO Merge when not able to build hash (redistribution) JOIN relation

在使用gbase进行merge的时候,可能会报下面的错误:
(42000): (GBA-02SC-1001) Can’t DO Merge when not able to build hash (redistribution) JOIN relationship between merge target and source.

产生原因:
在merge进行关联的时候on后面的条件不是分布键会出现这种错误。
在进行merge的时候,on后面需要包含所有的分布键。

merge into table a 
using table b
on ......
and......
when matched  when 
update 
set ......

这个时候on后面要包含a表的所有的分布键,但是对b表没有规定,on后面可以是分布键也可以不是。

另外需要注意的是,我们不能对分布键字段进行更新,这样当我们在做更新的时候就可能出现问题。
例如:
我们有两个表:tab1 tab2

CREATE TABLE TAB1
(ID  VARCHAR(8),
,NAME VARCHAR(8),
,AGE  VARCHAR(8)
,SEX  VARCHAR(8)
) ENGINE = EXPRESS DISTRIBUTED BY ('ID','NAME');
CREATE TABLE TAB2
(ID  VARCHAR(8),
,NAME VARCHAR(8),
,AGE  VARCHAR(8)
,SEX  VARCHAR(8)
) ENGINE = EXPRESS DISTRIBUTED BY ('ID','NAME');

我们希望使用表2的信息更新表1的信息的时候,我们会这样写

MERGE INTO TAB1 T1
USING TAB2 T2
ON T1.ID = T2.ID
AND T1.NAME = T2.NAME
WHEN MATCHED THEN 
UPDATE
SET T1.ID = T2.ID
   ,T1.NAME = T2.NAME

但是这样会产生另外一个错误:
ERROR 1722 (HY000): (GBA-02DD-0006) Can’t update distributed column
这是因为要对分布键字段ID NAME 做update操作,这样是不被允许的。

解决方法:我们可以给两个表添加一个公有字段(随便一个字段都可以,然后将这个字段设置为分布键,要保证这两个表的这个字段是一样的,这样就没有改变原来的关联条件了)

CREATE TABLE TAB1
(ID  VARCHAR(8),
,NAME VARCHAR(8),
,AGE  VARCHAR(8)
,SEX  VARCHAR(8)
,PRO_DATE VARCHAR(8) DEFAULT CURRENT_DATE
) ENGINE = EXPRESS DISTRIBUTED BY ('PRO_DATE');
CREATE TABLE TAB2
(ID  VARCHAR(8),
,NAME VARCHAR(8),
,AGE  VARCHAR(8)
,SEX  VARCHAR(8)
,PRO_DATE VARCHAR(8) DEFAULT CURRENT_DATE
) ENGINE = EXPRESS DISTRIBUTED BY ('PRO_DATE');
MERGE INTO TAB1 T1
USING TAB2 T2
ON T1.ID = T2.ID
AND T1.NAME = T2.NAME
AND T1.PRO_DATE = T2.PRO_DATE 
WHEN MATCHED THEN 
UPDATE
SET T1.ID = T2.ID
   ,T1.NAME = T2.NAME

这样我们就满足gabse merge的条件,并且对我们所希望的字段进行更新了。

如果我们不希望改变原表的分布键设置的话,我们可以使用临时表。
使用gbase建临时表有两种不同的方式:
第一种:

CREATE TEMPORARY TABLE TEM_TAB AS SELECT ......

使用这种方式,我们不用建临时表的表结构,相当于with…as…的写法(ps:在gbase尽量避免with…as…的写法)

对于临时表的数据类型是由数据库自己指定的。这种时候我们也无法指定分布键,因此,如果需要使用临时表进行merge操作的话,还是要使用第二种方式,建 表结构并且指定分布键。

第二种:

CREATE TEMPORARY TABLE TAB1
(COL1  DATA_TYPE,
COL2  DATA_TYPE,
COL3 DATA_TYPE
......)
DISTRIBUTED BY ('COL1'......);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值