ClickHouse常见问题之使用另一个表中的值更新行 - Java技术债务

2024-06-21 16:58:11 浏览数 (3)

问题描述

有两张表,A表是广告活动名称, B表是广告活动产生的报表数据(包含广告活动名称);想把B表中的名称修改为B表中的名称。 更新语句如下:

代码语言:javascript复制
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)

内部查询没问题,但是总是异常。 结果如下:

代码语言:javascript复制
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的相关联接

问题解决

第一种

数据量不大的情况下,删数据或者删表重新导入新的数据,简单粗暴。

第二种

使用一种变通方法,为更新创建一个特殊的联接引擎表。

代码语言:javascript复制
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;

0 人点赞