【问题标题】:Postgres Update column with another rows dataPostgres 用另一行数据更新列
【发布时间】:2013-05-04 03:11:51
【问题描述】:

好的,我有两张桌子

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

policy
attr_id, lead_time 

我需要做的是在 period(这是一个日期)从度量中获取“net_orders”,添加“lead_time”并更新度量表“ref_1”,其中 period = period+lead

我目前有一个选择,可以让我得到我需要的数据,但是当我试图找出 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

这是最终运行的查询。我在第一个答案时遇到错误,但看起来它现在正在工作!

【问题讨论】:

  • 更新查询的第一部分有效。 AKA 如果我放弃 where,它会将当前的 net_orders 设置为自身。添加 WHERE 子句返回 0 行更新

标签: sql database postgresql join


【解决方案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

【讨论】:

  • 您放置 s.attr = m.attr 而不是相反的原因是什么?
  • @Scottzozer 你的意思是s.attr_id = m.attr_id?顺序不应该有所作为。你确定吗?
  • 是的,我尝试了两种方式,它只复制了 m.attr_id = s.attr_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多