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

Oracle SQL中如何按最大table3_id关联多表获取指定数据

Oracle SQL实现:关联每个IIN对应Table3中ID最大的记录

针对你的需求,需要为每个IIN仅关联Table3中ID(即table3_id)最大的记录,以下提供两种可行的Oracle SQL实现方案:

方案一:使用窗口函数ROW_NUMBER()

这种方式逻辑清晰,适合处理分组取TopN的场景:

SELECT t1.IIN, t3.date_reg, t4.id AS id_addr, t4."other attributes"
FROM Table1 t1
LEFT JOIN Table2 t2 ON t2.IIN = t1.IIN
LEFT JOIN (
    SELECT 
        person_id, 
        date_reg, 
        id_addr,
        -- 按person_id分组,每组内按ID降序排序,标记最大ID的记录为rn=1
        ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY ID DESC) AS rn
    FROM Table3
) t3 ON t2.person_id = t3.person_id AND t3.rn = 1
LEFT JOIN Table4 t4 ON t3.id_addr = t4.id
ORDER BY t1.IIN;

逻辑说明:

  1. 子查询中通过ROW_NUMBER()窗口函数,将Table3按person_id分组,每组内按ID降序排列,给每组中ID最大的记录标记rn=1;
  2. 外层关联子查询时,只筛选rn=1的记录,确保每个person_id(对应唯一IIN)仅关联到Table3中ID最大的那条数据;
  3. 全程使用LEFT JOIN,保证Table1中所有IIN都能被返回,哪怕没有对应关联记录(如示例中的0401)。

方案二:使用关联子查询

这种写法更简洁,适合数据量不大或已有合适索引的场景:

SELECT t1.IIN, t3.date_reg, t4.id AS id_addr, t4."other attributes"
FROM Table1 t1
LEFT JOIN Table2 t2 ON t2.IIN = t1.IIN
LEFT JOIN Table3 t3 ON t2.person_id = t3.person_id
    -- 关联时仅匹配当前person_id对应的最大Table3 ID
    AND t3.ID = (SELECT MAX(ID) FROM Table3 WHERE person_id = t2.person_id)
LEFT JOIN Table4 t4 ON t3.id_addr = t4.id
ORDER BY t1.IIN;

逻辑说明:

关联Table3时,通过子查询(SELECT MAX(ID) FROM Table3 WHERE person_id = t2.person_id)直接获取当前person_id对应的最大Table3 ID,仅关联这条匹配的记录,同样保留所有Table1的IIN记录。

对比原SQL的问题

你当前的SQL未做过滤,会返回每个IIN对应的所有Table3关联记录,而上述两种方案都能精准筛选出每个IIN对应的最大ID的Table3记录,完全符合你的预期结果。

内容的提问来源于stack exchange,提问作者alnvalnnn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:30:23