2015-11-23 72 views
0

请假设你有一个Oracle表,表A,如下:的Oracle PL/SQL:与表的汇总数据更新表B A

enter image description here

在该表的主要领域是FIELD1和FIELD2 。你可以看到:

a)对于夫妻(AAA,1),我们有两个值:200.03和100.02; b)对夫妇(BBB,3)我们有两个值:300.04和400.05。

我们想使之聚集如下,以下表更新:

enter image description here

表B中的字段3,我们想的200.03和100.02的总和存储与参考夫妇(AAA,1),并且我们想存储300.04和400.05的总和,并参照这对夫妇(BBB,3)。

请想象一下,我们可以有很多不同的夫妻: (ZZZ,77) (YYY,12) ...等等。

请假设提交给一对夫妇的记录可能超过两个,在这种情况下,我们应该总结关于同一对夫妇的所有记录的值。

在我们简单的情况下,结果将是以下几点:

enter image description here

的实际情况与2000万的记录的表A,所以我喜欢写在PL软件/使用BULK COLLECT,UPDATE和FORALL的SQL。

什么是最好的办法?请提供PL/SQL代码以解释如何解决问题。

非常感谢您考虑我的要求。

回答

4

坦率地说,我不会在这里使用BULK COLLECT和FORALL - 我会使用MERGE语句。尝试像

MERGE INTO TABLE_B b 
    USING (SELECT FIELD1, FIELD2, SUM(FIELD3) AS TOTAL_FIELD3 
      FROM TABLE_A 
      GROUP BY FIELD1, FIELD2) a 
    ON (b.FIELD1 = a.FIELD1 AND 
     b.FIELD2 = a.FIELD2) 
WHEN NOT MATCHED THEN 
    INSERT (FIELD1, FIELD2, FIELD3) 
    VALUES (a.FIELD1, a.FIELD2, a.TOTAL_FIELD3) 
WHEN MATCHED THEN 
    UPDATE 
    SET FIELD3 = a.TOTAL_FIELD3; 

祝你好运。

+0

*删除一半答案和刚刚提出 - 鲍勃的,而不是* –

+0

但我从互联网上读取,对于巨大的表,这是不方便的MERGE .....! – UltraCommit

+0

我已经指定我们有二千万条记录,所以在一次交易中它不可能更新2000万条记录......!出于这个原因,采用BULK COLLECT,UPDATE和FORALL的方法更加方便。 – UltraCommit