从包含空值的另一个表数据更新表中的多个列

时间:2016-10-26 14:01:09

标签: sql postgresql

我有两个表有6列的表,在一个表中(我要更新的那个)前三列已经填充,其他三个我刚刚制作,所以它们是空的。

汇总表

Number, ID, height, weight, volume, density
1        1     5       
2        2     5
3        3     12

我有一个完全填充的表格,其中使用了相同的ID,但其他数据波动并且没有高度

每日表

Number, ID, name, weight, volume, density
1       1    c3     23               10
2       2    c17    24.2    1        5
3       3    c12    22      2        6
4       1    c3     21      2
5       2    c17    25               8

我想从Daily表中获取最后一个weight,volume,density值,并使用它们填充Summary表中的那些列。这两个表都有数以千计的条目,每日一个接近一百万。

结果应该是摘要表更改为

Number, ID, height, weight, volume, density
1       1     5      21      2   
2       2     5      25               8
3       3     12     22      2        6

我可以使用this question获得的信息一点一点地完成,但我想一次完成所有操作。 请协助。

4 个答案:

答案 0 :(得分:3)

这样的事情:

update summary 
  set weight = t.weight,
      volume = t.volume, 
      density = t.density
from (
  select distinct on (id) id, weight, volume, density
  from daily
  order by id, number desc
) t
where t.id = summary.id;

内部选择将仅返回每日表中具有最高“数字”的每个ID的行。有关其他解决方法,请参阅

在线示例:http://rextester.com/AWT29305

答案 1 :(得分:1)

您可以使用窗口功能获取每个ID的每日表中的最新条目。我在SQL Server中对此进行了测试,但我相信postgres的语法在这种情况下是相同的。

With LatestDaily As
(
  select *
  from (
    Select RANK() OVER (Partition By ID ORDER BY Number DESC) as r, *
    From Daily
  ) t
  where t.r = 1
)
Update summary s
   Set Weight = d.Weight, Volume = d.Volume, Density = d.Density
From LatestDaily d 
where s.ID = d.ID;

答案 2 :(得分:1)

试试这个:

with Daily as (
select d.number, d.Id, d.weight, d.volume, d.density 
From  daily d 
join (select id, max(number) from daily group by ID) d2 on d.number = d2.number
)
update Summary
set weight = d2.weight
, volume = d2.volume
, density = d2.density
from Daily d2
where id = d2.id
and
(weight<> d2.weight OR
volume <> d2.volume OR
density <> d2.density)
)

这应该确保您获得每个ID的正确最新记录,并且只有那些需要更新的记录。

答案 3 :(得分:0)

更新摘要SET weight = _weight,volume = _volume,density = _density 从 (   SELECT ID _ID,weight _weight,volume _volume,density _density   来自细节   数字IN(SELECT MAX(数字)FROM详细信息GROUP BY ID) ) 一个WHERE ID = _ID