[英]How to update multiple columns of a table using another tables data in SQL?
[英]Update multiple columns in a table from another tables data including nulls
我有两个包含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
我想从“每日”表中获取最后的重量,体积,密度值,并使用它们来填充“摘要”表中的那些列。 这两个表都有成千上万个条目,每天都有接近一百万个条目。
结果应为摘要表更改为
Number, ID, height, weight, volume, density
1 1 5 21 2
2 2 5 25 8
3 3 12 22 2 6
我可以使用从这个问题中得到的信息来一点一点地做,但是我想一次全部完成。 请协助。
像这样:
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
您可以使用加窗功能来获取每日表中每个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;
尝试这个:
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以及仅那些需要更新的ID都获得正确的最新记录。
更新摘要SET重量= _重量,体积= _体积,密度= _密度FROM(选择ID _ID,重量_weight,体积_volume,密度_密度FROM Details WHERE Number IN(SELECT MAX(Number)FROM Details GROUP BY ID))一个WHERE ID = _ID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.