2013-05-09 25 views
1

好吧,我有兩個表與另一行的數據Postgres的更新列

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

policy 
attr_id, lead_time 

我需要做的就是抓住從度量「net_orders」期末(這是一個日期),添加'lead_time'並更新度量表'ref_1',其中period = period + lead

我目前有選擇讓我獲得我需要的數據,但是當我嘗試圖out 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) 

編輯

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

更新查詢的第一部分起作用。也就是說,如果我放棄在哪裏,它會將當前的net_orders設置爲自己。添加** WHERE **子句返回0行更新 – Scottzozer 2013-05-09 15:25:43

回答

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 2013-05-09 19:57:03

+0

它不適用於s = m只有m = s – Scottzozer 2013-05-09 20:00:21

+0

更改您的答案並接受它作爲答案 – Scottzozer 2013-05-09 20:01:30