Обновить столбец с несколькими значениями Postgres - PullRequest
0 голосов
/ 14 ноября 2018

Пример данных:

Sample Data

Я пытаюсь обновить столбец значениями из нескольких столбцов в другой таблице, если два столбца совпадают.

Рассмотрим следующий запрос:

UPDATE application_table
SET    asset_list = asset_table.asset_name
FROM   asset_table
WHERE  application_table.application_name = asset_table.applications;

Моя структура таблицы:

application_table:
"asset_list";         "text[]"
"application_name";   "character varying"

asset_table:
"asset_name";         "character varying"
"applications";       "character varying"

Я получаю следующую ошибку:

ERROR:  column "asset_list" is of type text[] but expression is of type character varying
Line 12 SET    asset_list = asset_table.asset_name

1 Ответ

0 голосов
/ 14 ноября 2018

Что вам нужно сделать, это агрегировать значение asset_name на applications и установить asset_list на это агрегированное значение.

Проблема в том, что вы не можете сделать что-то вроде

UPDATE ..
SET asset_list = ARRAY_AGG(asset_name)
FROM ...

потому что агрегатные функции не разрешены в таких обновлениях.

Итак, есть два других способа сделать это:

UPDATE app_table
SET asset_list = _asset_list
FROM (
    SELECT applications, ARRAY_AGG(asset_name ORDER BY asset_name) AS _asset_list
    FROM asset_table
    GROUP BY applications
) AS a
WHERE app_name = applications;

https://www.db -fiddle.com / f/ pKB5k6Lexwzqv6ZbCCdJay / 0

Сначала создается результирующий набор различных имен приложений и массив всех asset_name для каждого из имен приложений.Затем он обновляет таблицу как обычно с этим значением массива.

Другой способ:

UPDATE app_table
SET asset_list = (SELECT ARRAY_AGG(asset_name ORDER BY asset_name)
                  FROM asset_table
                  WHERE applications = app_name)
;

https://www.db -fiddle.com / f / 8oVWsubXW93n142gtZYLXB / 0

Это обновит каждую запись в app_table и вычислит значение массива на лету для каждой записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...