You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用非分组表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:42