使用 ClickHouse 中另一个表中的值更新行

Posted

技术标签:

【中文标题】使用 ClickHouse 中另一个表中的值更新行【英文标题】:Updating rows with values from another table in ClickHouse 【发布时间】:2019-04-19 15:22:02 【问题描述】:

我有两张表,一张是关于县的数据,另一张是关于州的数据。不同的州有时可能有完全相同的县名,所以我试图在我的县表中填充一个unique_name 列,该列是县名和该县所在州的缩写(例如:檀香山县,HI)。

我想出了以下查询:

ALTER TABLE counties
    UPDATE unique_name =
    (
        SELECT concat(counties.name, ', ', states.name_abbr)
        FROM counties
        INNER JOIN states
        ON counties.statefp = states.statefp
    ) WHERE unique_name = ''

但是,我不断收到以下错误:

DB::Exception: Unknown identifier: states.statefp, context: required_names: 'states.statefp' source_tables: table_aliases: private_aliases: column_aliases: public_columns: masked_columns: array_join_columns: source_columns: .

内部查询本身工作得很好,但我不明白为什么当我尝试进行更新时会出现这个错误。有什么想法吗?

【问题讨论】:

【参考方案1】:

ClickHouse 不支持 ALTER TABLE UPDATE 的依赖连接。幸运的是,有一种解决方法。您必须为更新创建一个特殊的联接引擎表。像这样的:

CREATE TABLE states_join as states Engine = Join(ANY, LEFT, statefp);

INSERT INTO states_join SELECT * from states;

ALTER TABLE counties 
UPDATE unique_name = concat(name, joinGet('states_join', 'name_abbr', statefp))
WHERE unique_name = '';

DROP TABLE states_join;

注意,它仅适用于 19.x 版本。

【讨论】:

concat 部分按预期工作(由select concat(name, joinGet('states_join', 'name_abbr', statefp)) from counties 测试)。但是,update 语句实际上并没有更新unique_name 列中的任何行。 您能检查一下您的 system.mutations 表吗?这里有什么错误吗? @MarcioPorto 也许您正在尝试更新作为 ORDER BY 键一部分的列?

以上是关于使用 ClickHouse 中另一个表中的值更新行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 更新一个表中的值以匹配 Oracle SQL Developer 中另一个表的值

使用表中另一个字段的值更新一个字段,其中字段值本身就是键

更新表中所有行的有效方法

从表中选择所有行并仅将不同的值插入到 C# 中另一个位置的数据库中

根据另一个表中的值更新表中的值[重复]

如何将表中的数据用作 SQL 中另一个命令的值?