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

问题描述

有两张表,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;
   登录后才可以发表呦...

专注分享Java技术干货,包括
但不仅限于多线程、JVM、Spring Boot
Spring Cloud、 Redis、微服务、
消息队列、Git、面试题 最新动态等。

想交个朋友吗
那就快扫下面吧


微信

Java技术债务

你还可以关注我的公众号

会分享一些干货或者好文章

Java技术债务