gpt4 book ai didi

sql - Postgres 9.2 PL/pgSQL 循环简单更新

转载 作者:行者123 更新时间:2023-11-29 11:15:40 26 4
gpt4 key购买 nike

我有下表:

+----+----------+----------+
| id | trail_id | position |
+----+----------+----------+
| 11 | 16 | NULL |
| 12 | 121 | NULL |
| 15 | 121 | NULL |
| 19 | 42 | NULL |
| 20 | 42 | NULL |
| 21 | 42 | NULL |
+----+----------+----------+

我正在寻找一种使用递增整数(per parent)更新 position 的简单方法。所以在我完成之后,表格应该是这样的:

+----+-----------+----------+
| id | trail_id | position |
+----+-----------+----------+
| 11 | 16 | 1 |
| 12 | 121 | 1 |
| 15 | 121 | 2 |
| 19 | 42 | 1 |
| 20 | 42 | 2 |
| 21 | 42 | 3 |
+----+-----------+----------+

我认为我需要的是一个函数,它针对给定的 trail 遍历所有行,具有简单的递增索引并更新 position 列。然而,我是 pgSQL 新手,所以我很高兴听到有更简单的方法来做到这一点。

我现在尝试的解决方案是这样的

CREATE FUNCTION fill_positions(tid integer) RETURNS integer AS $$
DECLARE
pht RECORD;
i INTEGER := 0;
BEGIN
FOR pht IN SELECT * FROM photos WHERE photos.trail_id = tid LOOP
i := i + 1;
UPDATE photos SET position = i WHERE id = pht.id;
END LOOP;
RETURN i;
END;
$$ LANGUAGE plpgsql;

我很确定它可以更简洁,而且不必使用函数。

最佳答案

您不需要存储函数。您可以使用一条语句来做到这一点。

with new_numbers as (
select id,
trail_id,
row_number() over (partition by trail_id order by id) as position
from photos
)
update photos
set position = nn.position
from new_numbers nn
where nn.id = photos.id;

关于sql - Postgres 9.2 PL/pgSQL 循环简单更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13803722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com