【问题标题】:Update column with multiple values Postgres使用多个值 Postgres 更新列
【发布时间】:2018-11-14 13:51:50
【问题描述】:

样本数据:

如果两列匹配,我正在尝试使用另一个表中多列的值更新一列。

考虑以下查询:

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

【问题讨论】:

  • 它告诉我我需要转换数据,我不确定执行此操作的正确语法。
  • 由于asset_list 是一个数组,您是要尝试将asset_table.asset_name 添加到数组中,还是用仅包含该值的新数组覆盖任何现有值?
  • @eurotrash,我想覆盖。我想将此设置为一项工作,以不断检查asset_table并添加任何新的asset_name,如果它们被分配了匹配的应用程序。

标签: postgresql sql-update


【解决方案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_names 的数组。然后它像往常一样使用该数组值更新表。

另一种方式是:

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 中的每条记录,并动态计算每条记录的数组值。

【讨论】:

  • 您的第二个解决方案将强制嵌套循环连接,所以我认为您的第一个解决方案更好。
猜你喜欢
  • 2023-03-10
  • 2021-12-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
相关资源
最近更新 更多