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

如何在多表联查结果中获取各类型的最新数据?

问题描述

我有三张表:

表A(version为唯一键):

versiontype
01A
02B

表B:

idversionitemcreatetime
10112023-02-12
20112023-03-12

表C:

tableBidnameqty
1test018
2test027

我原本编写了以下SQL,用于查询表A中各type的最新详情:

select * 
from A 
left join B 
  on A.version=B.version 
left join C 
  on B.id=C.ableBd 
where A.version in (
   select max(version) from A group by type
   )

但表B中同一version存在多条不同createtime的记录,需要修改SQL以仅获取每个version对应的createtime最新的结果,预期输出如下:

versiontypeidversionitemcreatetimetableBidnameqty
01A20112023-03-121test018
02B
解决方案

可以使用窗口函数ROW_NUMBER()对表B的记录按version分组、createtime倒序排序,筛选出每组中createtime最新的记录,再与其他表关联。同时修正原SQL中关联表C时的字段名错误(原C.ableBd应为C.tableBid),修改后的SQL如下:

SELECT 
    A.version,
    A.type,
    B.id,
    B.version AS b_version,
    B.item,
    B.createtime,
    C.tableBid,
    C.name,
    C.qty
FROM A
LEFT JOIN (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY version ORDER BY createtime DESC) AS rn
    FROM B
) B ON A.version = B.version AND B.rn = 1
LEFT JOIN C ON B.id = C.tableBid
WHERE A.version IN (
    SELECT MAX(version) FROM A GROUP BY type
)

关键说明:

  • 子查询中通过ROW_NUMBER()为每个version下的记录按createtime从新到旧编号,最新记录的编号为1
  • 关联表B时仅保留rn=1的记录,确保每个version只取最新的一条数据
  • 保留LEFT JOIN逻辑,保证表A中无对应B/C记录的行(如type=B的version=02)能正常输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:37