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

18 浏览
0 Comments

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

我有两个表格,每个表格有6列。在其中一个表格(我想要更新的表格)中,前三列已经填充了数据,另外三列是我刚刚创建的,所以它们是空的。\n汇总表格\n

编号,ID,身高,体重,体积,密度
1       1      5
2       2      5
3       3      12

\n我还有另一个完全填充了数据的表格,其中使用相同的ID,但其他数据会波动,而且它没有身高这一列。\n每日表格\n

编号,ID,姓名,体重,体积,密度
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

\n我想要从每日表格中获取最后的体重、体积和密度数值,并将它们用来填充汇总表格中的这些列。这两个表格都有数千条记录,而每日表格接近一百万条。\n结果应该是汇总表格变为\n

编号,ID,身高,体重,体积,密度
1       1      5      21      2   
2       2      5      25               8
3       3      12     22      2        6

\n我可以根据我从这个问题中获得的信息逐个进行操作,但我希望能一次性完成。\n请协助。

0
0 Comments

问题出现的原因是需要从另一个表中的数据更新一个表中的多个列,包括空值。解决方法是使用窗口函数来获取每个ID在每日表中的最新条目。在SQL Server中进行了测试,但我相信PostgreSQL的语法在这种情况下是相同的。

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;

PostgreSQL需要在末尾使用`;`而不是在开头。在PostgreSQL中,解决“最大n个组”问题时,使用`distinct on()`通常比窗口函数更快。而且,在PostgreSQL中,使用连接的`update`语法与其他数据库不同。在`from`子句中不应重复目标表。

非常感谢你的指正。我想知道SQL Server是否有类似于PostgreSQL的`distinct on()`的等效方法。这是一个很有用的函数。

我稍微修改了你的语句中的语法错误。

0
0 Comments

问题的原因是需要从另一个表的数据更新一个表中的多个列,包括空值。解决方法是使用一个子查询来获取每个ID的最新记录,并将该记录与需要更新的表进行连接,然后使用UPDATE语句来更新需要更新的列。

具体解决方法如下:

1. 创建一个名为Daily的子查询,从daily表中选择number、Id、weight、volume和density列。在子查询中,使用JOIN和GROUP BY子句来获取每个ID的最新记录。

2. 使用UPDATE语句来更新Summary表。将weight、volume和density列的值设置为Daily子查询中对应的值。

3. 使用FROM子句将Summary表与Daily子查询连接起来。通过在连接条件中使用ID来匹配记录。

4. 使用WHERE子句来过滤掉那些不需要更新的记录。只有当weight、volume或density列的值与Daily子查询中的对应值不相等时才进行更新。

这样的解决方法可以确保获取每个ID的最新记录,并只更新那些需要更新的记录。虽然可能需要一些时间来理解这个解决方法,但它可以很好地工作。

0
0 Comments

问题的原因:需要从daily表中更新summary表的多个列的数据,包括null值。

解决方法:使用以下SQL语句来更新summary表:

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;

以上SQL语句中的内部查询将返回daily表中每个id的最大"number"的行。通过使用distinct on (id)和order by id, number desc来实现。然后将这些结果与summary表进行匹配,根据id进行更新。

这种方法非常简单且适用于作者的需求。

0