【问题标题】:MERGE table using old value + new value使用旧值 + 新值合并表
【发布时间】:2016-09-02 02:48:25
【问题描述】:

我有以下表格:

表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

Table2是增量加载,对于表中的每个CashId,现金存款可以发生几次。对于第一次加载,CashId=1 的 2 现金存款。第二次加载是 CashId=1 的 1 现金存款,但此加载在第二天就出来了。

我想检查下一次装载是否有新的现金存款。表 1 中的金额列由表 2 中每个 CashId 的价格和税金的总和数据组成。

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'

我需要将新加载的新 Total_Sum 添加到 Table1 中 Amount 列中的现有数据。当有新数据并且我运行 MERGE 语句时,Total_Sum 应该添加到 Amount 列中的现有值,但是当数据第一次出现时应该替换 Amount 列中的空值。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    你几乎有语法:

    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 中的重复值。

    【讨论】:

    • 我尝试过这种方式,但出现错误:无法在源表中获得稳定的行集“由于 dml 活动较大或非确定性 where 子句。
    • @Merix - 你说它是聚合的,但你确定你在 table3 中没有重复的 CashId 值吗?
    猜你喜欢
    • 2021-10-22
    • 2017-10-05
    • 1970-01-01
    • 2015-09-26
    • 2013-08-28
    • 2017-03-16
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多