2010-03-03 35 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