查询InvoiceId时关联表并获取TableA的最大版本数据
修正后的SQL查询方案
原查询存在以下关键问题:
- 字段名错误:子查询中
NewA.Version应为NewA.Versionnumber,NewA.BarcodeNumber应为NewA.Barcode - 逻辑错误:子查询错误地将最大版本值固定为1,而非匹配当前记录的版本号
- 重复结果:TableB中存在重复的
TableAId记录,会导致结果行重复;且LEFT JOIN后加B.Invoice(应为B.InvoiceId)的过滤条件,实际等价于INNER JOIN
方案一:使用窗口函数(推荐,逻辑清晰)
通过ROW_NUMBER()给每个Barcode分组内的记录按版本号降序排名,取排名第一的最高版本记录,再关联去重后的TableB数据:
WITH RankedTableA AS ( SELECT TableAId, Barcode, Versionnumber, -- 按Barcode分组,版本号降序排序,取每个分组的第一条记录 ROW_NUMBER() OVER (PARTITION BY Barcode ORDER BY Versionnumber DESC) AS row_rank FROM TableA ) SELECT R.TableAId, R.Barcode, R.Versionnumber, B.InvoiceId FROM RankedTableA R -- 关联去重后的TableB,避免重复结果 JOIN ( SELECT DISTINCT TableAId, InvoiceId FROM TableB WHERE InvoiceId = 'abc123' ) B ON R.TableAId = B.TableAId WHERE R.row_rank = 1;
方案二:使用子查询获取最大版本
先通过子查询统计每个Barcode的最高版本号,再关联TableA获取对应记录,最后关联去重后的TableB:
SELECT A.TableAId, A.Barcode, A.Versionnumber, B.InvoiceId FROM TableA A -- 关联每个Barcode的最大版本号 JOIN ( SELECT Barcode, MAX(Versionnumber) AS MaxVersion FROM TableA GROUP BY Barcode ) MaxVer ON A.Barcode = MaxVer.Barcode AND A.Versionnumber = MaxVer.MaxVersion -- 关联去重后的TableB JOIN ( SELECT DISTINCT TableAId, InvoiceId FROM TableB WHERE InvoiceId = 'abc123' ) B ON A.TableAId = B.TableAId;
两种方案都能得到预期结果:
| TableAId | Barcode | Versionnumber | InvoiceId |
|---|---|---|---|
| 2 | 123456 | 2 | abc123 |
| 3 | 123457 | 1 | abc123 |
内容的提问来源于stack exchange,提问作者KC1
相关产品推荐
相关产品推荐

