2013-05-09 4 views
1

Ok У меня есть две таблицыколонка Postgres Обновление с другими данными строк

measures 
attr_id, period, net_orders, ref_1 (key = attr_id,period) 

и

policy 
attr_id, lead_time 

Что мне нужно сделать, это захватить «net_orders» от меры в период (который является дата), Добавьте «lead_time» и обновите таблицу мер «ref_1», где период = период + вывод

В настоящее время у меня есть выбор, который доставит мне данные, которые мне нужны, но я все время теряю себя в голове, пытаясь понять, t предложения where.

SELECT 
    m.attr_id, 
    m.period, 
    m.net_orders, 
    p.lead_time, 
    DATE(m.period) + CAST(p.lead_time as INTEGER) as updateperiod 
FROM 
    measures m 
    INNER JOIN policy p ON p.attr_id = m.attr_id 

Я застрял с некоторыми из следующего запроса - он же неполными

UPDATE 
    measures m 
SET 
    ref_1 = (SELECT m1.net_orders FROM measures m1 
      WHERE m1.attr_id = m.attr_id AND m1.period = m.period) 
WHERE 
    attr_id = (SELECT m3.attr_id 
      FROM measures m3 WHERE m3.attr_id = m.attr_id 
      AND m3.period = m.period) 
    AND m.period = (SELECT DATE(m2.period) + CAST(p2.lead_time AS INTEGER) 
      FROM measures m2 INNER JOIN policy p2 ON p2.attr_id = m2.attr_id 
      WHERE m2.attr_id = m.attr_id AND m2.period = m.period) 

EDIT

update measures m 
set reference_1 = s.net_orders 
from (
    select 
     m.attribute_id, period, net_orders, 
     DATE(period) + CAST(lead_time as integer) as periodlevel 
    from 
     measures m 
     inner join policies p on p.attribute_id = m.attribute_id 
) s 
where 
    m.attribute_id = s.attribute_id 
    and m.period = s.periodlevel 

Это вопрос, который в конечном итоге работает. Я получал ошибки с первым ответом, но похоже, что он работает сейчас!

+0

Выполняется первая часть запроса на обновление. AKA, если я упаду туда, он установит текущие net_orders для себя. Добавление предложения ** WHERE ** возвращает 0 обновленных строк – Scottzozer

ответ

1
update measures m 
set ref_1 = s.net_orders 
from (
    select 
     m.attr_id, period, net_orders, 
     period::date + lead_time::int period 
    from 
     measures m 
     inner join 
     policy using(attr_id) 
) s 
where 
    s.attr_id = m.attr_id 
    and s.period = m.period::date 
+0

, по какой причине вы поместили s.attr = m.attr, а не наоборот? – Scottzozer

+0

он не работает с s = m только m = s – Scottzozer

+0

изменить свой ответ и принять его как ответ – Scottzozer

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