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;
逻辑说明:
- 子查询中通过
ROW_NUMBER()窗口函数,将Table3按person_id分组,每组内按ID降序排列,给每组中ID最大的记录标记rn=1; - 外层关联子查询时,只筛选
rn=1的记录,确保每个person_id(对应唯一IIN)仅关联到Table3中ID最大的那条数据; - 全程使用
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
相关产品推荐
相关产品推荐

