2010-03-03 76 views
1

關於UPDATE的SQL語法問題。通過給下面的例子來問這個問題它會容易得多:SQL語法問題

**Payments Table** 

ID user_id payment_due payment_made 
1  3  10.0   5.0 
1  3  10.0   10.0 
1  9  20.0   20.0 



**Balance Table** 

ID user_id current_balance 
1  3   ??? 
2  9   ??? 

讓我們說,我想更新針對特定用戶的當前餘額。什麼是正確和有效的SQL語法來添加所有付款費用並從爲特定用戶所做的所有付款中扣除它?

在這種情況下,CURRENT_BALANCE用戶 '3' 是5.0和用戶 '9' 爲0.0

回答

2

如何:

select 
    ID, 
    user_id, 
    (sum(payment_due) - sum(payment_made)) current_balance 
from 
    PaymentsTable 

group by 
    ID, 
    user_id 
+0

這可能是最好的方法。由於餘額會不斷變化,因此不要保留「餘額」表。你甚至可以把這個查詢變成一個視圖,以便它的行爲像'Balance'表。 – cmptrgeekken 2010-03-03 18:39:31

+0

或使用觸發器保持數據同步。 – 2010-03-03 18:47:03

+0

如上所述不保留一個餘額表......存儲計算字段(current_balance)打破了規範化的規則,使用查詢來即時獲取數據 – Leslie 2010-03-03 18:53:23

1

您需要使用子查詢。像這樣的東西應該工作:

UPDATE 
    balance_table b 
SET 
    current_balance = (SELECT 
      SUM(payment_due - payment_made) 
     FROM 
      payments_table p 
     WHERE 
      p.user_id = b.user_id) 
2

要更新表,使用一個子查詢:

UPDATE Balance_Table b 
SET current_balance = 
    (SELECT SUM(payment_due - payment_made) 
    FROM Payments_Table p 
    WHERE p.user_id = b.user_id 
) 

想想更新的方法雖然。只要Payments_Table發生變化,您的Balance_Table就會不同步,因此您可能會選擇更好的數據。

+0

我想他可以把這個UPDATE語句放在'Payments'表的觸發器中。這將消除一些差異。 – cmptrgeekken 2010-03-03 18:54:12

+0

@cmptrgeekken:使用觸發器是可能的。如果'Payments_Table'中有很多記錄,但是隻有很少的記錄發生變化並且往往會查詢'Balance_Table'的結果,那麼這可能是正確的方法。否則,只需總結'Payments_Table'將是更簡單的方法。 – 2010-03-03 19:23:58