如何在多表联查结果中获取各类型的最新数据?
问题描述
我有三张表:
表A(version为唯一键):
| version | type |
|---|---|
| 01 | A |
| 02 | B |
表B:
| id | version | item | createtime |
|---|---|---|---|
| 1 | 01 | 1 | 2023-02-12 |
| 2 | 01 | 1 | 2023-03-12 |
表C:
| tableBid | name | qty |
|---|---|---|
| 1 | test01 | 8 |
| 2 | test02 | 7 |
我原本编写了以下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最新的结果,预期输出如下:
| version | type | id | version | item | createtime | tableBid | name | qty |
|---|---|---|---|---|---|---|---|---|
| 01 | A | 2 | 01 | 1 | 2023-03-12 | 1 | test01 | 8 |
| 02 | B |
解决方案
可以使用窗口函数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
相关产品推荐
相关产品推荐

