Обновление строк значениями из другой таблицы в ClickHouse

#clickhouse

#clickhouse

Вопрос:

У меня есть две таблицы, одна с данными о округах, а другая с данными о штатах. Иногда в разных штатах могут быть округа с одинаковым точным названием, поэтому я пытаюсь заполнить 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 не поддерживает зависимые объединения для ИЗМЕНЕНИЯ ОБНОВЛЕНИЯ ТАБЛИЦЫ. К счастью, есть обходной путь. Для обновления необходимо создать специальную таблицу механизма объединения. Что-то вроде этого:

 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.

Комментарии:

1. Часть concat работает так, как ожидалось (проверено select concat(name, joinGet('states_join', 'name_abbr', statefp)) from counties ). Однако инструкция update фактически не обновляет ни одной строки в unique_name столбце.

2. Не могли бы вы проверить свою таблицу system.mutations? Какая-нибудь ошибка здесь есть?

3. @MarcioPorto может быть, вы пытаетесь обновить столбец, который является частью порядка ПО ключу?