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

按关联表最新日期记录更新当前表字段的SQL写法问题

问题根因

你遇到的两个报错属于Access环境下编写更新查询的典型问题:

  • 直接在WHERE子句中使用Max()这类聚合函数违反SQL语法规则:聚合计算是对整组数据做统计,不能直接作为单行筛选条件写在WHERE中,必须先完成聚合计算输出结果后,才能用结果做匹配筛选。
  • 直接关联带聚合的查询做更新时,Access会判定多表聚合连接的查询为只读对象,因此抛出「必须使用可更新查询」的错误。
可落地实现方案

你的业务逻辑不需要复杂写法,拆分两步即可完全避开上述限制,稳定实现需求:

步骤1:创建聚合查询获取每台车的最新行驶记录日期

新建一个选择查询,命名为qryLatestDriveDatePerVehicle,写入如下SQL:

SELECT VehicleID, Max(DateDriven) AS LatestDriveDate
FROM tblVehicleDailyDriveDetails
GROUP BY VehicleID;

运行这个查询可以得到每台车对应的最新一条行驶记录的日期,这个查询本身是只读的,但我们仅用它做匹配筛选,不需要对它做更新操作。

步骤2:编写最终的更新查询

新建更新查询,关联车辆表、每日行驶明细表、上一步创建的日期查询,SQL如下(注意修正你原SQL里[tblVehicles][.ODO]的笔误,这里多写了一个错位的方括号):

UPDATE 
  (tblVehicles
  INNER JOIN qryLatestDriveDatePerVehicle
    ON tblVehicles.VehicleID = qryLatestDriveDatePerVehicle.VehicleID)
  INNER JOIN tblVehicleDailyDriveDetails
    ON (qryLatestDriveDatePerVehicle.VehicleID = tblVehicleDailyDriveDetails.VehicleID)
    AND (qryLatestDriveDatePerVehicle.LatestDriveDate = tblVehicleDailyDriveDetails.DateDriven)
SET tblVehicles.ODO = tblVehicles.ODO + tblVehicleDailyDriveDetails.TRIP;

逻辑说明

  • 这个写法里只有tblVehicles是被更新的目标表,聚合查询仅用于定位每台车最新日期对应的那条行驶明细记录,不会触发Access的只读查询限制
  • 执行时会精准匹配每台车最新提交的当日行驶里程,累加到总里程字段中,完全匹配你表单录入后更新总里程的业务场景
  • 如果需要在用户提交表单后自动触发更新,直接在表单提交按钮的点击事件中调用这个更新查询即可。

内容的提问来源于stack exchange,提问作者Joe Werner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:45:51