更新sql intarray

时间:2016-04-21 13:43:07

标签: sql postgresql

我有一张桌子

table list(
   lst intarray,
   owner integer);
 table files(
   file_id integer,
   uid integer
  );

对于每个owner,我想将所有file_id个与uid对应的lst放入 update list set lst = lst || file_id FROM files WHERE uid = owner ; 。我试过了

intarray

alter table TblParts add constraint pk_1 PRIMARY KEY(Code,Location); 全部初始化为空数组。似乎发生的是我在每次执行时向列表中添加一个元素。我希望(并希望)一次性添加它们。

显然,我很困惑。有人可以帮忙解释一下吗?

感谢。

2 个答案:

答案 0 :(得分:1)

更新语句(逻辑上讲)首先查找与WHERE条件匹配的所有行,然后对于每个行,应用SET子句中的操作。 FROM子句提供的连接语义不会改变这一点,因此每行只更新一次。

您可以使用array_agg聚合函数在单个查询中计算列表的新值:

SELECT
  uid,
  array_agg(file_id)
FROM
  files
GROUP BY
  uid;

由于我们现在每个所有者都有一行,我们可以在UPDATE语句中使用它;最简单的方法是将其放在子查询中:

UPDATE list
  SET lst = subquery.calculated_list
FROM
(
  SELECT
      uid,
      array_agg(file_id) as calculated_list
  FROM
      files
  GROUP BY
      uid
) AS subquery
WHERE
  subquery.uid = owner;

我创建了a SQLFiddle demo of the above

答案 1 :(得分:-2)

试试这个:

UPDATE list
   SET list.lst = list.lst OR files.file_id
   FROM list  INNER JOIN  files ON list.owner = files.uid