以下是这两个表的 struct :
这是"主"表:
CREATE TEMP TABLE final_table (
idx INTEGER,
pids INTEGER[],
stats INTEGER[]
)
INSERT INTO final_table
VALUES
(2733111, '{43255890, 8653548}'::int[], '{4, 5}'::int[]),
(2733112, '{54387564}'::int[] , '{6}'::int[] ),
(2733113, '{}'::int[] , '{}'::int[] )
以下是临时表中的数据:
CREATE TEMP TABLE aggreg (
idx INTEGER,
pid INTEGER,
count INTEGER
)
VALUES
(2733111, 21854997, 2),
(2733111, 21854923, 10),
(2733112, 12345689, 3),
(2733113, 98765348, 11),
(2733111, 43255890, 4),
(2733112, 54387564, 6);
目标是用临时表中的数据更新第一个表(FINAL_TABLE).
困难在于,在classic 的更新中,同一行将被调用多次,因此只有在更新中才会有最后的结果.因此,在UPDATE
的FROM
号中必须经过一个SELECT
号潜艇,而我就是被困在那里的.
我似乎在SELECT SUB中找不到正确的语法来执行此操作.
此外,在实际的表中,有些行可能已经在第pids
列和第stats
列中包含数据.此UPDATE
的目的是仅添加pid
及其对应的count
.
我测试的最后一个查询(但没有运行)如下:
UPDATE final_table AS ft
SET
stats = ag2.stats || (ag2.stats - ft.stats),
pids = ag2.pids || (ag2.pids - ft.pids)
FROM (
SELECT
ag.idx,
array_agg(ag.pid) AS pids,
array_agg(ag."count") AS stats
FROM
aggreg AS ag
INNER JOIN
final_table AS ft
ON
ag.idx = ft.idx
GROUP BY
ag.idx
) AS ag2
WHERE
ag2.idx = ft.idx
另外,我使用intarray
扩展来执行array - array
操作.
根据示例表,我希望得到以下结果:
idx | pids | stats |
---|---|---|
2733111 | {43255890, 8653548, 21854997, 21854923} | {4, 5, 2, 10} |
2733112 | {54387564, 12345689} | {6, 3} |
2733113 | {98765348} | {11} |
提前感谢您的帮助!