我有一张桌子
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);
全部初始化为空数组。似乎发生的是我在每次执行时向列表中添加一个元素。我希望(并希望)一次性添加它们。
感谢。
答案 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;
答案 1 :(得分:-2)
试试这个:
UPDATE list
SET list.lst = list.lst OR files.file_id
FROM list INNER JOIN files ON list.owner = files.uid