You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MS Access更新查询无法执行:关联不可更新合计查询失败

Access更新查询关联不可更新查询后无法运行的解决办法

嘿,我太懂这种糟心的情况了——Access里只要更新查询关联了不可更新的查询(比如带聚合、联合或者复杂JOIN的查询),整个更新逻辑直接就瘫了,根本跑不起来。先把你的问题理清楚:

  • 你的核心需求:仅通过合计查询CM_qryLabor6_parentunion_sum_PROD读取计算数据,写入可编辑的CM_WCRoll
  • 问题根源:你尝试关联了不可更新的PM_qryBOM_LvlX_nochild查询,导致整个更新查询变成了不可编辑状态,你的SQL开头是这样的:
UPDATE (PM_qryBOM_LvlX_nochild INNER JOIN (CM_qryLabor6_parentunion_sum_PROD INNER JOIN CM_WCRoll ON (CM_qryLabor6_parentunion_sum_PROD.PartID = CM_WCRoll.PartID) AND (CM_qryLabor6_parentunion_sum_PROD...

下面给你几个实测有效的解决思路,按优先级排序:


思路1:拆分查询,移除不必要的关联(最推荐)

如果PM_qryBOM_LvlX_nochild只是用来过滤需要更新的记录,并没有参与字段计算,那直接把它的过滤逻辑移到WHERE子句里就行,完全不用做JOIN:

UPDATE CM_WCRoll 
INNER JOIN CM_qryLabor6_parentunion_sum_PROD 
ON CM_WCRoll.PartID = CM_qryLabor6_parentunion_sum_PROD.PartID
SET CM_WCRoll.目标字段 = CM_qryLabor6_parentunion_sum_PROD.计算字段
WHERE CM_WCRoll.PartID IN (SELECT PartID FROM PM_qryBOM_LvlX_nochild)

这样主更新查询只关联可读取的合计查询和可编辑的目标表,避开了不可更新查询的干扰,性能也更好。


思路2:用临时表过渡不可更新查询的数据

如果PM_qryBOM_LvlX_nochild必须参与关联逻辑(比如要匹配多字段),那就先把它的结果导出到临时表——临时表是可更新的,用它来做关联就没问题了:

  1. 先运行生成临时表的查询(每次运行前记得删除旧表):
DROP TABLE IF EXISTS tmp_BOMFilter;
SELECT * INTO tmp_BOMFilter FROM PM_qryBOM_LvlX_nochild;
  1. 再用临时表写更新查询:
UPDATE (tmp_BOMFilter INNER JOIN (CM_qryLabor6_parentunion_sum_PROD INNER JOIN CM_WCRoll ON CM_qryLabor6_parentunion_sum_PROD.PartID = CM_WCRoll.PartID) ON tmp_BOMFilter.PartID = CM_WCRoll.PartID)
SET CM_WCRoll.目标字段 = CM_qryLabor6_parentunion_sum_PROD.计算字段;

思路3:用域聚合函数替代关联合计查询

如果合计查询的逻辑不复杂,也可以直接把计算逻辑塞进DSum()/DAvg()这类域函数里,彻底避开关联查询:

UPDATE CM_WCRoll
SET CM_WCRoll.LaborTotal = DSum("[LaborHours]","CM_qryLabor6_parentunion_sum_PROD","PartID='" & CM_WCRoll.PartID & "'")
WHERE CM_WCRoll.PartID IN (SELECT PartID FROM PM_qryBOM_LvlX_nochild);

这个方法适合小数据集,数据量大的话性能会有点拉胯,酌情使用。

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

火山引擎 最新活动