问题描述
有两张表,A表是广告活动名称, B表是广告活动产生的报表数据(包含广告活动名称);想把B表中的名称修改为B表中的名称。 更新语句如下:
ALTER TABLE B
UPDATE campaign_name =
(
SELECT campaign_name FROM B b
JOIN A a ON b.campaign_id = a.campaign_id
) WHERE campaign_id in (ids)
内部查询没问题,但是总是异常。 结果如下:
DB::Exception: Unknown identifier: a.campaign_id , context: required_names: 'a.campaign_id' source_tables: table_aliases: private_aliases: column_aliases: public_columns: masked_columns: array_join_columns: source_columns: .
问题排查
经官网和google查询ClickHouse不支持ALTER TABLE UPDATE的相关联接
问题解决
第一种
数据量不大的情况下,删数据或者删表重新导入新的数据,简单粗暴。
第二种
使用一种变通方法,为更新创建一个特殊的联接引擎表。
CREATE TABLE A_join as states Engine = Join(ANY, LEFT, statefp);
INSERT INTO A_join SELECT * from A;
ALTER TABLE B UPDATE campaign_name = joinGet('A_join', 'campaign_name', statefp))
WHERE campaign_id in (ids);
DROP TABLE A_join;