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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:29