在使用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'......);