循环以从postgres中的不同表运行多个更新

时间:2014-02-05 19:32:59

标签: function postgresql postgresql-9.1 plpgsql dynamic-sql

我正在运行Postgres 9.1并拥有一个包含30个空列和30个额外临时表(returns.msf_mse - temp23_01)的主表(temp23_30)。我想用来自每个临时表的特定列的数据填充主表中的每个空列。每个临时表中的相关列始终为cumret_past

我试图创建一个存储过程/函数来实现这一点并且一直无处可去。我也尝试循环更新语句但无法使其工作。我的基本查询是:

update returns.msf_mse as a
set cumret_past_23_01 = b.cumret_past  
from temp23_01 as b
where a.date = b.date
and a.permno = b.permno;

我只想运行此语句30次,每次递增cumret_past_23_itemp23_i

1 个答案:

答案 0 :(得分:0)

您可以使用DO语句(第9.0+页)和EXECUTE来遍历所有表:

DO
$$
BEGIN

FOR i IN 1..30 LOOP
    EXECUTE '
    UPDATE returns.msf_mse a
    SET    cumret_past_23_' || to_char(i, 'FM00') || ' = b.cumret_past  
    FROM   temp23_' || to_char(i, 'FM00') || ' b
    WHERE  a.date = b.date
    AND    a.permno = b.permno';
END LOOP;

END
$$

使用to_char()格式化数字时,请注意前导空格。我使用FM修饰符来摆脱它。

除此之外:我不会使用date作为列名,它很容易与基类型或同名函数冲突。