Access跨表更新查询:同SHPMT ID多FILERENTRTYNBR匹配问题咨询
问题根因
仅使用SHPMT ID作为两表更新的唯一关联键时,若源表current中同一SHPMT ID对应多条不同FILERENTRTYNBR的记录,Access无法判定源表记录与目标表all holds同ID记录的对应关系,会默认取匹配到的第一条源表值,批量更新该ID下所有目标行,最终出现同ID所有行被更新为同一个FILERENTRTYNBR值的问题。
解决方案
核心逻辑:补充关联条件,让两表的待匹配记录形成1:1精准映射,消除关联歧义。根据现有数据的结构,分两种场景处理:
- 场景1:两表同
SHPMT ID下的记录存在可对应的业务字段
比如同运单下的条目行号、业务类型、录入时间、件数等字段可以唯一区分同ID下的不同记录,直接将该字段加入关联条件即可。
以两表都存在行序号字段LINE_NBR为例,更新查询的SQL写法如下:
如果用查询设计视图操作,除了拖拽关联两表的UPDATE [all holds] INNER JOIN [current] ON ([all holds].[SHPMT ID] = [current].[SHPMT ID]) AND ([all holds].[LINE_NBR] = [current].[LINE_NBR]) SET [all holds].[FILERENTRTYNBR] = [current].[FILERENTRTYNBR];SHPMT ID字段外,再把第二匹配字段也拖拽建立关联,再执行更新即可。 - 场景2:两表同
SHPMT ID下无现成的匹配字段,仅需按行顺序一一对应
先给两表同ID下的记录生成组内序号,再用SHPMT ID + 组内序号作为联合关联键更新,步骤如下:- 为
current表生成带组内序号的查询,保存为current_rn:SELECT c1.*, COUNT(c2.[FILERENTRTYNBR]) AS group_rn FROM [current] AS c1 LEFT JOIN [current] AS c2 ON (c1.[SHPMT ID] = c2.[SHPMT ID]) AND (c1.[FILERENTRTYNBR] >= c2.[FILERENTRTYNBR]) GROUP BY c1.[SHPMT ID], c1.[FILERENTRTYNBR]; - 为
all holds表生成带组内序号的查询,保存为allholds_rn,注意将SQL中的[自增主键ID]替换为你目标表中实际存在的唯一不重复字段(比如Access默认的自增ID字段):SELECT a1.*, COUNT(a2.[自增主键ID]) AS group_rn FROM [all holds] AS a1 LEFT JOIN [all holds] AS a2 ON (a1.[SHPMT ID] = a2.[SHPMT ID]) AND (a1.[自增主键ID] >= a2.[自增主键ID]) GROUP BY a1.[自增主键ID], a1.[SHPMT ID]; - 基于上述两个带序号的查询执行更新:
UPDATE [allholds_rn] INNER JOIN [current_rn] ON ([allholds_rn].[SHPMT ID] = [current_rn].[SHPMT ID]) AND ([allholds_rn].group_rn = [current_rn].group_rn) SET [allholds_rn].[FILERENTRTYNBR] = [current_rn].[FILERENTRTYNBR];
- 为
注意:执行任何更新操作前请务必备份
all holds表原始数据,避免更新逻辑错误导致数据丢失。若同一SHPMT ID下两表的记录条数不一致,多余的记录不会被匹配更新,执行前建议先核对两表同ID下的条目数量是否匹配。
内容的提问来源于stack exchange,提问作者Johnny O
相关产品推荐
相关产品推荐

