2015-07-03 117 views
1

我想使用MS Access SQL更新具有ID主键的表tblBillingPlan。我想用我通过查询在组中计算出的值更新字段db_FeeTypeMS Access UPDATE查询失败,因为查询不可更新

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 
); 

这里是

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记录做一个行,但我敢肯定,我以前写的SQL可以在Oracle和SQL服务器中执行此操作。我生锈了。

+0

“Billing_plan”和“Billing_plan_fee”表或视图? –

回答

2

访问Domain Aggregate功能可以帮助当访问时抱怨UPDATE不可更新。在这种情况下,使用DMax

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

然而,DMax是访问特定的,所以不会在Oracle或SQL Server工作。

+0

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