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

Mar*_*rto 1 clickhouse

我有两张表,一张是关于县的数据,另一张是关于州的数据。不同的州有时会有完全相同的县名,所以我试图unique_name在我的县表中填充一列,该列是县名和该县所在州的缩写的串联(例如:Honolulu County, 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 = ''
Run Code Online (Sandbox Code Playgroud)

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

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: .
Run Code Online (Sandbox Code Playgroud)

内部查询本身运行良好,但我不明白为什么当我尝试进行更新时会出现此错误。有任何想法吗?

小智 5

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;
Run Code Online (Sandbox Code Playgroud)

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