2012-06-04 36 views
1

我有以下查詢(MS Access 2010中),我想要使用與正在運行的平衡更新表:SQL更新查詢提出了「操作必須使用一個可更新的查詢」

UPDATE Accounts a SET a.CurrentBalance = 
(SELECT sum(iif(c.categoryid = 2,t.Amount * -1, t.Amount)) + 
     (select a1.openingbalance 
     from accounts a1 where a1.accountid = a.accountid) AS TotalAmount 
FROM transactions t inner join (
    transactiontypes tt inner join 
    categories c on c.categoryid = tt.categoryid) 
    on t.transactiontypeid = tt.transactiontypeid); 

使用的表格有:

回答

1

您不能在更新查詢中使用聚合函數(如SUM)。請參閱Why is my query read-only?以獲取將導致您的查詢爲「不可更新」的條件的完整列表。

1

Access數據庫引擎包括對域功能(DMax,DSum,DLookup等)的支持。而域功能通常可以讓你規避不可更新的查詢問題。

考慮DSum()MyTable這3行數據。

id MyNumber 
1  2 
2  3 
3  5 

然後在立即窗口中,這裏有2個樣本DSum()表達式。

? DSum("MyNumber", "MyTable") 
10 

? DSum("IIf(id=1,MyNumber * -1, MyNumber)", "MyTable") 
6 

我想你可以使用類似的東西,第二個表達式作爲查詢的sum(iif(c.categoryid = 2,t.Amount * -1, t.Amount)部分的替代品。

也許您可以使用DLookup()表達式來獲取您的TotalAmount值。不幸的是,我試圖將當前的SQL轉換爲域函數感到沮喪。我意識到這不是一個完整的解決方案,但希望它能指出你有用的東西。如果你編輯你的問題,向我們展示開始數據的簡要樣本,以及你希望根據樣本數據從你的UPDATE語句中獲得什麼,我願意再看看這個。

最後,考慮你是否絕對必須在表中存儲CurrentBalance。根據經驗,避免存儲派生值。相反,當您需要時,使用SELECT查詢來計算派生值。這種方法可以保證當您檢索CurrentBalance時,它始終是最新的。它也可以讓你努力創建一個工作的UPDATE語句。

3

解決「查詢必須使用可更新查詢」的方法是使用臨時表,然後根據臨時表中的聚合數據更新最終目標數據。就你的情況而言,正如mwolfe所暗示的,你在內部select查詢中有一個聚合函數。解決方法可以爲這種情況提供快速修復,就像它對我來說一樣。

編號:http://support.microsoft.com/kb/328828

這篇文章幫助我瞭解的情況的細節和周圍設置工作: http://www.fmsinc.com/MicrosoftAccess/query/non-updateable/index.html

相關問題