Microsoft Access带内连接的UPDATE语句异常行为问询
Access一对多关系下INNER JOIN UPDATE查询的异常表现解析
在Microsoft Access中执行带INNER JOIN的UPDATE查询时,当涉及一对多关系,会出现不符合直觉的表现,以下是简化后的示例:
示例数据
Table A(目标更新表)
| ClientID | Year | DollarValue | ConvValue |
|---|---|---|---|
| 90 | 1985 | 1000 | |
| 90 | 1985 | 500 |
Table B(关联表)
| ClientID | Year | RegionID | ECF |
|---|---|---|---|
| 90 | 1985 | 3 | 100 |
| 90 | 1985 | 4 | 10 |
执行的UPDATE查询
UPDATE tableA INNER JOIN tableB ON ([tableA].ClientID=[tableB].ClientID) AND ([tableA].Year=[tableB].Year) SET tableA.ConvValue = [tableA]!DollarValue/[tableB]!ECF
执行结果
- 实际更新后的Table A:
| ClientID | Year | DollarValue | ConvValue |
|---|---|---|---|
| 90 | 1985 | 1000 | 100 |
| 90 | 1985 | 500 | 50 |
- 查询的数据表视图显示4行(对应连接后的记录集):
| ConvValue |
|---|
| 100 |
| 100 |
| 50 |
| 50 |
- 执行时对话框提示“将更新4条记录”,但实际仅Table A的2行被更新,且最终值仅使用了Table B中RegionID=4的ECF(10)计算。
疑问解答
1. 为何查询的数据表视图仅显示一种转换系数的计算结果?
查询的数据表视图展示的是INNER JOIN生成的全量匹配记录集(Table A的2行 × Table B的2行 = 4行),但你看到的ConvValue全是用RegionID=4的ECF计算的结果,是因为Access在执行UPDATE时,对Table A的同一行会执行多次更新,最后一次更新的值会覆盖之前的所有结果。查询视图显示的是最终更新后的值,对应连接记录集的4行,因此呈现重复的最终结果,而非每次更新的中间值。
2. 数据表视图有4行,但被更新的表仅2行,Access的更新逻辑是怎样的?
Access的UPDATE查询执行逻辑分为两步:
- 先基于JOIN条件生成所有匹配的记录集(这里是4行,即对话框提示的“4条记录”);
- 遍历该记录集,对目标表(Table A)的对应行依次执行更新操作。由于Table A的同一行对应记录集中的多条行,该行会被多次更新,最终仅保留最后一次更新的结果。因此虽然记录集有4行,但Table A只有2条唯一记录,最终仅这2行被更新(且是最后一次更新后的值)。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

