如何让UPDATE语句在SQL Server的同一行上执行两次

时间:2016-11-23 16:00:27

标签: sql sql-server

我正在尝试更新SQL中的表。特别是尝试通过减去我通过主键链接的另一个表中的数值来更新数字字段。例如,更新此表:

ID  NAME    BALANCE     CURRSTATUS
1   FRED    45          OWED
2   JAMES   21          OWED
3   JOHN    0           PAID
4   BETH    33          OWED
5   HARRY   5           REFUND
6   WILLIAM 555         COLLECT

通过应用此表的行:

ID  AMOUNT
6   500.00
6   55.00

所以我的预期结果与第一张表相同,只不过William的余额为0(555-500-55 = 0)。

我正在使用这样的sql语句:

UPDATE 
    TABLE1
SET 
    BALANCE = BALANCE - TABLE2.AMOUNT
FROM 
    TABLE2 
        LEFT OUTER JOIN TABLE1 ON TABLE1.ID = TABLE2.ID 

这适用于第一行但不执行table2中的第二行。我的最终结果总是55,而不是0.当我在第二张表中的两行是针对同一个人时,我只有这个问题。示例:如果我有一行威廉和一行约翰,他们都会按预期行事。

我错过了什么吗?或者只是UPDATE如何运作?

2 个答案:

答案 0 :(得分:3)

预聚合:

{{1}}

答案 1 :(得分:0)

在这里,您可以根据自己的情况选择CTE。

在CTE中准备您的套装,如从明确金额扣除后的明智总金额。然后在第一个表上进行更新。

  ;WITH CTE AS(
 SELECT T1.ID , T1.BALANCE- SUM(T2.AMOUNT)  as AMT
  FROM TABLE1 T1
  INNER JOIN TABLE2 T2 ON T1.ID = T2.ID
  GROUP BY T1.ID
  )
  UPDATE TABLE1 SET TABLE1.BALANCE  = CTE.AMT
  FROM CTE WHERE TABLE1.ID= CTE.ID