如何利用非分组表e1_addr更新Oracle表e1的Addr字段
解决方法:更新e1表Addr为对应Id的最新地址记录
我来帮你搞定这个问题!你需要将e1表的Addr字段更新为对应Id在e1_addr表中**最新(最大Mod_Date)**的地址值,下面是几种可靠的实现方案:
方法1:子查询关联(兼容多数数据库)
先为每个Id找到e1_addr中最新的地址记录,再关联e1表进行更新:
UPDATE e1 JOIN ( -- 子查询获取每个Id的最新地址 SELECT ea.Id, ea.Addr FROM e1_addr ea INNER JOIN ( SELECT Id, MAX(Mod_Date) AS latest_date FROM e1_addr GROUP BY Id ) AS max_dates ON ea.Id = max_dates.Id AND ea.Mod_Date = max_dates.latest_date ) AS latest_addr ON e1.Id = latest_addr.Id SET e1.Addr = latest_addr.Addr;
如果你的数据库支持LIMIT(比如MySQL),可以用更简洁的写法:
UPDATE e1 SET Addr = ( SELECT Addr FROM e1_addr ea WHERE ea.Id = e1.Id -- 注意:如果Mod_Date是字符串类型,要转成日期再排序,避免字符串排序错误 ORDER BY STR_TO_DATE(ea.Mod_Date, '%d-%m-%Y') DESC LIMIT 1 );
方法2:窗口函数(适用于SQL Server、PostgreSQL、MySQL 8.0+)
用ROW_NUMBER()窗口函数标记每个Id的最新记录,再进行更新:
WITH latest_addr AS ( SELECT Id, Addr, -- 按Id分组,按Mod_Date倒序排名,最新的记录rn=1 ROW_NUMBER() OVER (PARTITION BY Id ORDER BY STR_TO_DATE(Mod_Date, '%d-%m-%Y') DESC) AS rn FROM e1_addr ) UPDATE e1 SET Addr = (SELECT Addr FROM latest_addr WHERE Id = e1.Id AND rn = 1);
验证结果
执行更新后,查询e1表就能得到你期望的结果:
SELECT Id, Name, Addr FROM e1;
输出:
Id Name Addr ------------------ 1 Ramas Dli 2 Sam Gzb 3 Musa Gzb 4 Sebi Dli
注意事项
如果你的Mod_Date字段是字符串类型(不是日期类型),一定要用日期转换函数(比如STR_TO_DATE、CONVERT)转换后再排序,否则字符串排序会出现错误(比如10-05-2018会被错误判定为比18-05-2018大)。
内容的提问来源于stack exchange,提问作者hashir
相关产品推荐
相关产品推荐

