MERGE表使用旧值+新值

时间:2016-05-06 22:34:53

标签: sql oracle plsql

我有以下表格:

表1:

Id |   ClientId  |   Amount
------------------------------
1  |   100       |   
2  |   130       |   
..
9  |   280       |   

表2:源表

Id |  CashId  |  Price  |  Tax
-----------------------------
1  |    1     |   550   |  120
2  |    1     |   100   |   30
3  |    2     |   320   |   50
4  |    3     |   360   |  100
next data loads
5  |    1     |   80    |   20
6  |    2     |   20    |    9
7  |    4     |   190   |   80

等。 这是聚合到tmp表:

表3(tmp):

Id |  CashId  |  Total_Sum
-----------------------------
1  |    1     |   800
2  |    2     |   370   
3  |    3     |   460   

next data loads
1  |    1     |   100
2  |    2     |   29
3  |    4     |   270
表2是增量加载,对于表中的每个CashId,现金存款可以发生几次。首次装货是CashId = 1的2现金存款。对于第二次加载是CashId = 1的1现金存款,但是这个加载在第二天出现。

我想检查下次装货是否有新的现金存款。表1中的金额列包含每个CashId的来自表2的价格和税的总和数据。

Table1.Id = Table2.CashId

首次加载后应该如何查看Table1:

Id |   ClientId  |   Amount
------------------------------
1  |   100       |   800
2  |   130       |   370
...

第二次加载数据后:

Id |   ClientId  |   Amount
------------------------------
1  |   100       |   800 + 100 = 900
2  |   130       |   370 + 29 = 399
...

我想用这样的语句:

MERGE INTO Table1 trg
USING (SELECT * FROM Table3) cash
    ON trg.Id = cash.CashId
WHEN MATCHED THEN
UPDATE SET trg.Amount = 'trg.Amount + new Total_Sum'

我需要在表1中的Amount列中将新加载的Total_Sum添加到现有数据中。当新数据和我运行MERGE语句时,Total_Sum可以添加到Amount列中的现有值,但是当数据第一次出现时应该在Amount列中替换null值。

1 个答案:

答案 0 :(得分:0)

你几乎有语法:

MERGE INTO Table1 trg
USING (SELECT * FROM Table3) cash
    ON trg.Id = cash.CashId
WHEN MATCHED THEN
UPDATE SET trg.Amount = trg.Amount + cash.Total_Sum;

您可能希望将其修改为:

MERGE INTO Table1 trg
USING (SELECT cashid, sum(Total_Sum) as Total_Sum
       FROM Table3
       GROUP BY cashid
      ) cash
    ON trg.Id = cash.CashId
WHEN MATCHED THEN
UPDATE SET trg.Amount = trg.Amount + cash.Total_Sum;

这应该处理Table3中的重复值。