MS Access UPDATE 查询失败,因为查询不可更新

Posted

技术标签:

【中文标题】MS Access UPDATE 查询失败,因为查询不可更新【英文标题】:MS Access UPDATE query fails as query is not updateble 【发布时间】:2015-07-03 15:00:18 【问题描述】:

我想使用 MS Access SQL 更新一个表 tblBillingPlan,该表具有 ID 的主键。我想用我在查询分组中计算的值更新字段db_FeeType

FROM 子句引用 qryGIT,它返回两列 ID 和 FeeType。每个 ID 只返回一行。

UPDATE tblBillingPlan 
SET tblBillingPlan.db_FeeType = 
( SELECT MAX(GI.FeeType)
   FROM qryGIT AS GI
  WHERE GI.id=tblBillingPlan.ID
  GROUP BY GI.ID
);

当我运行时,我收到错误“查询不可更新”。我该如何解决这个问题?

我最初尝试过:

 UPDATE tblBillingPlan 
SET tblBillingPlan.db_FeeType = 
( SELECT GI.FeeType
   FROM qryGIT AS GI
  WHERE GI.id=tblBillingPlan.ID
);

这里是qryGIT的定义

SELECT Billing_plan.id
     , Billing_plan.name
     , IIf(Max([Fee]) Is Null Or Max([Fee])=Min([Fee])
          ,Max([Fee])
          ,"BP has BP Fee rows with different fee types") AS FeeType

FROM Billing_plan 
     LEFT JOIN Billing_plan_fee 
            ON Billing_plan.id = Billing_plan_fee.billing_plan_id

GROUP BY Billing_plan.id, Billing_plan.name;

请注意,Billing_plan_fee 最多有四行与给定的 Billing_plan.id 匹配。

我也尝试使用 TOP 修饰符只返回一行,这没有任何区别

UPDATE tblBillingPlanCPLAD 
SET tblBillingPlanCPLAD.FeeType = 

( SELECT TOP 1 GI.FeeType    -- TOP 1 made no differentce
   FROM GITAS GI
  WHERE GI.id=tblBillingPlan.ID
);

我将使用 DAO 记录集来执行此操作,但我确信我曾经编写过可以在 Oracle 和 SQL 服务器中执行此操作的 SQL。我生锈了。

【问题讨论】:

Billing_planBilling_plan_fee 是表还是视图? 【参考方案1】:

当 Access 抱怨 UPDATE 不可更新时,Access Domain Aggregate 函数可以提供帮助。在这种情况下,请使用DMax

UPDATE tblBillingPlan AS bp
SET bp.db_FeeType = 
    DMax(
        'FeeType',
        'qryGIT',
        'id=' & bp.ID
    );

但是,DMax 是特定于 Access 的,因此在 Oracle 或 SQL Server 中不起作用。

【讨论】:

噢,谢谢。我会让你知道它是否有效。我开始认为我应该使用 sql server,因为 T-SQL 提供了更多功能。嗯。

以上是关于MS Access UPDATE 查询失败,因为查询不可更新的主要内容,如果未能解决你的问题,请参考以下文章

MS Access UPDATE 查询很慢

使用模式匹配更新(MS Access)

使用带有 Azure 链接表的 Access 插入 SQL 失败

此 Access 查询的 MS SQL 等效项是啥?

MS Access 很长并出现“表达式过长”错误

MS Access SQL:使用另一个表中的Sum更新连接查询