2014-02-05 4 views
1

Я запускаю Postgres 9.1 и имею основную таблицу (returns.msf_mse) с 30 пустыми столбцами и 30 дополнительными временными таблицами (temp23_01 - temp23_30). Я хочу заполнить каждый из пустых столбцов в главной таблице данными из определенного столбца из каждой временной таблицы. Соответствующий столбец в каждой временной таблице всегда равен cumret_past.Петля для запуска нескольких обновлений из разных таблиц в postgres

Я попытался создать хранимую процедуру/функцию для достижения этой цели и никуда не денутся. Я также попытался выполнить цикл над оператором обновления, но не могу заставить его работать. Моя база запроса:

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_i и temp23_i каждый раз.

+0

Добро пожаловать в SO. Это достойный вопрос. Получил работу за первый пост. :) –

ответ

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 в качестве имени столбца, он легко конфликтует с базовым типом или функцией с тем же именем.

+0

Спасибо Эрвин. Это огромная помощь! – user2845013

Смежные вопросы