2016-03-15 56 views
0

我有两个表,每个表都包含数千条已支付或欠付保证金的记录。格式如下:基于独立表中条件的SQL更新表

Table A 
ID ID2 ID3 Payment 
1 REG P  102.5 
2 REG   120 
3 REG P  65.5 

Table B 
ID  Payment 
1  17.5 
2  0 
3  45.5 

其中表A显示已支付的金额,表B显示仍应付的金额。我想更新表B,以便任何时候没有支付保证金时,我会显示收取的总金额。例如,对于ID 1,我想更新B.Payment等于A.Payment + B.Payment,但我不想更新ID 2,因为这笔存款已经全额支付。我试着用下面的代码,但它在我的表与部分付款更新每一行,而不是仅仅行:

UPDATE B 
SET B.[Payment] = (A.[Payment] + B.[Payment]) 
FROM B LEFT JOIN A ON A.[ID] = B.[ID] 
WHERE A.[ID2] = 'REG' and A.[ID3] = 'P' 

如何在表格中的条件都满足时,我只更新表B中的字段?

+0

为什么你想要这样做吗?除非您创建触发器来保持表格更新,否则您将保留旧数据值。最好创建一个'View' –

+0

你的RDBMS是什么?不同的数据库有不同的'UPDATE JOIN' sintaxis –

+0

胡安卡洛斯 - 这是一个单一的更新,在此更新运行后,将以新格式添加数据而不是旧格式 – mdarr

回答

1

试试这个:

UPDATE b SET b.Payment = b.Payment + a.Payment 
FROM B b 
    JOIN (SELECT a.ID, Payment = sum(Payment) FROM A a 
      WHERE a.ID2 = 'REG' AND a.ID3 = 'P' 
      GROUP BY a.ID) a ON b.ID = a.ID 

它总结表A的所有付款每个ID,然后将其添加到付款列在表B.

0

我不确定b.id2在您的代码中引用了什么。

试试这个

UPDATE b 
SET b.payment = b.payment + 
       (SELECT a.payment FROM a WHERE a.id=b.id AND a.id2='REG') 
WHERE b.payment<>0; 
+0

使用'ctrl-k '格式化为代码' –

+0

我很抱歉,我不清楚 - 我刚刚更新了我的原始问题,以解决与b.id2问题。我认为你所建议的代码接近我所需要的,但是更新应该发生的决定因素实际上是当A.ID3 ='P'时,而不是当支付<> 0时。这是我挣扎的地方 - 因为B中的更新取决于A中的多个列。 – mdarr