使用多个值Postgres更新列

时间:2018-11-14 13:51:50

标签: postgresql sql-update

样本数据:

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 :(得分:1)

您需要做的是将每个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中的每条记录,并为每条记录动态计算数组值。