SQL关联表查询结果不符预期,求实现同一tId下最新版本Qty总和
解决相同tId下最新版本记录的qty求和问题
先理清楚你的数据场景和需求:
- 表A的
tId=100对应两条记录(id=200、201) - 表B中这两个AId对应的记录里,每个AId的最新版本分别是:
- AId=200:version=2(qty=2)
- AId=201:version=1(qty=2)
- 最终需求的正确总和应该是
2+2=4
你原查询的问题
你原语句里的子查询select max(version) from B where itemId=44会返回整个itemId=44的最大version(也就是2),但AId=201的最新版本是1,这样version=(...)的条件会把AId=201的这条有效记录过滤掉,导致结果不符合预期。
正确的解法
方法1:使用窗口函数(推荐,简洁高效)
利用ROW_NUMBER()窗口函数,给每个AId分组的记录按version降序排名,只保留排名第一的最新版本记录,再求和:
SELECT SUM(qty) AS sum_qty FROM ( SELECT B.qty, ROW_NUMBER() OVER (PARTITION BY B.AId ORDER BY B.version DESC) AS rn FROM B JOIN A ON A.id = B.AId WHERE B.itemId = 44 AND A.tId = 100 ) AS latest_records WHERE rn = 1;
如果存在同一个AId下有多个相同最高version的记录(比如AId=200有两条version=2的记录),可以把ROW_NUMBER()换成RANK(),这样会保留所有最高version的记录并一起求和。
方法2:关联子查询找到每个AId的最新版本
先找到每个符合条件的AId对应的最大version,再关联回B表筛选出这些记录,最后求和:
SELECT SUM(B.qty) AS sum_qty FROM B JOIN A ON A.id = B.AId JOIN ( SELECT AId, MAX(version) AS max_version FROM B JOIN A ON A.id = B.AId WHERE B.itemId = 44 AND A.tId = 100 GROUP BY AId ) AS latest_versions ON B.AId = latest_versions.AId AND B.version = latest_versions.max_version WHERE B.itemId = 44 AND A.tId = 100;
这两种方法都能准确计算出同一tId下,每个关联AId的最新版本记录的qty总和。
内容的提问来源于stack exchange,提问作者Khir
相关产品推荐
相关产品推荐

