MySQL:使用两个表的总和更新值

MySQL:使用两个表的总和更新值,mysql,sql,Mysql,Sql,我有一张这样的桌子 负债: Id | CustomerId | liabilities --------------------------- 9 90 1000 ... Id | CustomerId | Payment --------------------------- 3 90 2500 4 91 1000 ... Id | balance --------------------------- 90

我有一张这样的桌子

负债

Id | CustomerId | liabilities
---------------------------
9    90           1000
...
Id | CustomerId | Payment
---------------------------
3    90           2500
4    91           1000
...
Id | balance
---------------------------
90   1500
91   1000
...
付款

Id | CustomerId | liabilities
---------------------------
9    90           1000
...
Id | CustomerId | Payment
---------------------------
3    90           2500
4    91           1000
...
Id | balance
---------------------------
90   1500
91   1000
...
客户

Id | CustomerId | liabilities
---------------------------
9    90           1000
...
Id | CustomerId | Payment
---------------------------
3    90           2500
4    91           1000
...
Id | balance
---------------------------
90   1500
91   1000
...

如您所见,客户的余额是其所有付款的总和减去其所有负债的总和。什么是更新余额的SQL查询?

您可以使用
update
语句对包含
付款
负债
合计的派生表执行
左联接
操作:

UPDATE Customer AS c
LEFT JOIN (
  SELECT CustomerId, SUM(Payment) AS TotalPayment
  FROM Payments
  GROUP BY CustomerId
) AS p ON c.Id = p.CustomerId
LEFT JOIN (
  SELECT CustomerId, SUM(liabilities) AS TotalLiabilities
  FROM Liabilities
  GROUP BY CustomerId
) AS l ON c.Id = l.CustomerId  
SET balance = COALESCE(TotalPayment, 0) - COALESCE(TotalLiabilities, 0)

或者,您可以在
UPDATE
语句中使用相关子查询:

UPDATE Customer AS c 
SET balance = COALESCE((SELECT SUM(Payment) 
                        FROM Payments 
                        WHERE CustomerId = c.Id) , 0)
              - 
              COALESCE((SELECT SUM(liabilities) 
                        FROM Liabilities 
                        WHERE CustomerId = c.Id)  , 0)

您可以使用
UPDATE
语句对包含
付款
负债
合计的派生表执行
左联接
操作:

UPDATE Customer AS c
LEFT JOIN (
  SELECT CustomerId, SUM(Payment) AS TotalPayment
  FROM Payments
  GROUP BY CustomerId
) AS p ON c.Id = p.CustomerId
LEFT JOIN (
  SELECT CustomerId, SUM(liabilities) AS TotalLiabilities
  FROM Liabilities
  GROUP BY CustomerId
) AS l ON c.Id = l.CustomerId  
SET balance = COALESCE(TotalPayment, 0) - COALESCE(TotalLiabilities, 0)

或者,您可以在
UPDATE
语句中使用相关子查询:

UPDATE Customer AS c 
SET balance = COALESCE((SELECT SUM(Payment) 
                        FROM Payments 
                        WHERE CustomerId = c.Id) , 0)
              - 
              COALESCE((SELECT SUM(liabilities) 
                        FROM Liabilities 
                        WHERE CustomerId = c.Id)  , 0)

你可以考虑安排的事件,这里有更多的信息:这是一个很好的观点。但在这一点上,我其实只是想得到一个查询,将做更新。。。然后,事件是个好主意。你可以考虑安排的事件,这里有更多的信息:这是一个很好的观点。但在这一点上,我其实只是想得到一个查询,将做更新。。。那么这些活动就是一个好主意。