样本数据:
如果两列匹配,我正在尝试使用另一个表中多个列的值更新一列。
考虑以下查询:
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
答案 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中的每条记录,并为每条记录动态计算数组值。