2011-07-05 39 views
1

我是嘗試使用連接語句更新表,但它並不完全正確。當一個條件成立時,我需要能夠使用來自不同表格的數據更新數據庫中的某一行。這是我到目前爲止,也許我很接近,有人可以提供一些見解?一起使用SQL加入和更新

UPDATE Project 
    SET Project.SumAssessments = SUM (Assessment.Amount) 
FROM Project 
JOIN Assessment ON Project.SumAssessments = SUM (Assessment.Amount) 
WHERE Assessment.ProjectCode = @ProjectID 
    AND Project.ProjectID = @ProjectID 
+0

您收到了什麼錯誤消息? –

+1

哪個DBMS?並且*不完全正常工作*不是我曾經在任何DBMS中看到過的錯誤消息。什麼不工作? –

+0

所以,如果我得到這個......你有一個總和列將在每一行?那將存儲來自同一張表的總和?也許你的桌子設計需要一些重構? –

回答

5

首先,我會擺脫整個列。它違反了適當數據庫設計的最基本規則之一。不要在數據庫中複製數據,因爲它幾乎總是最終不同步,即使它不需要額外的維護和保養。有非常罕見的情況下,應該違反。即使你認爲這種情況,你的情況幾乎肯定不是這種情況之一。通過適當的索引,應該不需要該列。

其次,沒有必要加入基於SUM的評估表。你已經加入了基於項目代碼的基礎上,你只是沒有在你所屬的ON條款中加入這個條件。更好的是,您可以使用子查詢來避免需要GROUP BY。由於您使用的是我認爲是主鍵(ProjectId)的子查詢應該可以正常工作。

UPDATE Project 
SET Project.SumAssessments = (
     SELECT SUM (Assessment.Amount) 
     FROM Assessment 
     WHERE ProjectCode = @ProjectID 
     ) 
FROM Project 
WHERE Project.ProjectID = @ProjectID 
+0

你是對的,感謝您的幫助!我對SQL很陌生,所以這些概念對我來說是非常新的。 – exogenic

1

我必須假設你想更新SumAssessments列,而不是基於查詢的關閉它,所以SUM函數不應該出現在您的加入子句。您根本不需要加入,儘管這些'總和'列是一個糟糕的主意,但您可以通過以下方法完成您想要的任務:

UPDATE Project set SumAssessments = (
    select SUM(Amount) from Assessments where ProjectCode = @ProjectID 
) 
where ProjectID = @ProjectID