2015-07-03 115 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