clickhouse是不支持联表更新的
现实现方法有两种
方法一:假如更新表格的表引擎是ENGINE = ReplacingMergeTree那么就可以用join进行表连接,然后将拼好得字段插入表中,加final查询或者进行OPTIMIZE (OPTIMIZE 语句会引发对数据的大量读写)就会发现查询的就是刚刚插入的那一条
注意:只改变要更改的那个字段,别的字段保持原状
方法二:借助join表引擎
示例:
根据id,将表2的colum2,更新到表1的colum2
表1数据
表2数据:
步骤一:
建表
CREATE TABLE [IF NOT EXISTS] [db.]join表 [ON CLUSTER cluster]
(
id字段,
colum字段,
) ENGINE = Join(join_strictness, join_type, k1[, k2, ...])
join_strictness:有两种类型ALL、ANY
ALL是在关联表在关联另一个表的时候,假如关联表存在重复数据,
那么只会关联其中一条,ANY不管重不重复,都会关联
注意:假如要实现联表更新,那么这里的类型就只能是ANY
join_type:所有标准 SQL JOIN 支持类型:
INNER JOIN,只返回匹配的行。
LEFT OUTER JOIN,除了匹配的行之外,还返回左表中的非匹配行。
RIGHT OUTER JOIN,除了匹配的行之外,还返回右表中的非匹配行。
FULL OUTER JOIN,除了匹配的行之外,还会返回两个表中的非匹配行。
CROSS JOIN,产生整个表的笛卡尔积, “join keys” 是 不 指定。
注:JOIN 没有指定类型暗指 INNER. 关键字 OUTER 可以安全地省略。
ClickHouse中提供的其他联接类型:
LEFT SEMI JOIN 和 RIGHT SEMI JOIN,白名单 “join keys”,而不产
生笛卡尔积。
LEFT ANTI JOIN 和 RIGHT ANTI JOIN,黑名单 “join keys”,而不产
生笛卡尔积。
LEFT ANY JOIN、RIGHT ANY JON和INNER ANY JOIN
ASOF JOIN and LEFT ASOF JOIN
k1[, k2, ...]:关联表的关键字段,假如有多个关联字段那么就直接用逗号隔开就好,例如ENGINE = Join(join_strictness, join_type, k1, k2)
步骤二:
将表2的表的数据插入到这个join表中
insert into join表 select * from 表2 where 表2条件
步骤三:
将表2数据更新到表1
用joinGet(join表',‘更改的值',表1的连接字段) 获取更改数据
查询核对脚本
select id,colum1,colum2,joinGet(join表',‘colum2',id);
结果如下:
alter table 表1 update mpnid=joinGet(join表',‘colum2',id) where 表1的条件;
更新结果: