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

从关联表选取单条行:查询Person表每人对应Address表最新地址

错误原因

你原SQL的核心问题出在子查询的关联条件上:子查询的WHERE条件里引用的a是外层LEFT JOIN的Address表别名,没有和子查询自身的Address表做人员ID关联,导致取到的最大address_id不符合预期,最终匹配不到地址数据。


修正方案1:调整子查询关联逻辑

给子查询内的Address表单独设置别名,明确关联规则即可正常运行:

SELECT
  p.person_id AS id,
  p.first_name AS first_name,
  p.last_name AS last_name,
  a.address AS address
FROM Person p
LEFT JOIN Address a ON
  a.address_id = (
    SELECT MAX(a_sub.address_id)
    FROM Address a_sub
    WHERE a_sub.person_id = p.person_id
  )

修正方案2:窗口函数写法(扩展性更强)

如果后续需要同时取最新地址的其他字段(比如城市、邮编),用窗口函数的写法更易维护:

SELECT
  p.person_id AS id,
  p.first_name,
  p.last_name,
  addr.address
FROM Person p
LEFT JOIN (
  SELECT 
    person_id,
    address,
    ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY address_id DESC) AS rn
  FROM Address
) addr ON addr.person_id = p.person_id AND addr.rn = 1

性能优化建议

如果Address表数据量较大,建议给person_id、address_id字段加联合索引,两种写法的执行效率都会有明显提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:54:03