从另一个表的数据中更新表中的多个列,包括空值。
从另一个表的数据中更新表中的多个列,包括空值。
我有两个表格,每个表格有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请协助。
问题出现的原因是需要从另一个表中的数据更新一个表中的多个列,包括空值。解决方法是使用窗口函数来获取每个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()`的等效方法。这是一个很有用的函数。
我稍微修改了你的语句中的语法错误。
问题的原因是需要从另一个表的数据更新一个表中的多个列,包括空值。解决方法是使用一个子查询来获取每个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的最新记录,并只更新那些需要更新的记录。虽然可能需要一些时间来理解这个解决方法,但它可以很好地工作。
问题的原因:需要从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进行更新。
这种方法非常简单且适用于作者的需求。