的Oracle PL/SQL:与表的汇总数据更新表B A
问题描述:
请假设你有一个Oracle表,表A,如下:的Oracle PL/SQL:与表的汇总数据更新表B A
在该表的主要领域是FIELD1和FIELD2 。你可以看到:
a)对于夫妻(AAA,1),我们有两个值:200.03和100.02; b)对夫妇(BBB,3)我们有两个值:300.04和400.05。
我们想使之聚集如下,以下表更新:
表B中的字段3,我们想的200.03和100.02的总和存储与参考夫妇(AAA,1),并且我们想存储300.04和400.05的总和,并参照这对夫妇(BBB,3)。
请想象一下,我们可以有很多不同的夫妻: (ZZZ,77) (YYY,12) ...等等。
请假设提交给一对夫妇的记录可能超过两个,在这种情况下,我们应该总结关于同一对夫妇的所有记录的值。
在我们简单的情况下,结果将是以下几点:
的实际情况与2000万的记录的表A,所以我喜欢写在PL软件/使用BULK COLLECT,UPDATE和FORALL的SQL。
什么是最好的办法?请提供PL/SQL代码以解释如何解决问题。
非常感谢您考虑我的要求。
答
坦率地说,我不会在这里使用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;
祝你好运。
*删除一半答案和刚刚提出 - 鲍勃的,而不是* –
但我从互联网上读取,对于巨大的表,这是不方便的MERGE .....! – UltraCommit
我已经指定我们有二千万条记录,所以在一次交易中它不可能更新2000万条记录......!出于这个原因,采用BULK COLLECT,UPDATE和FORALL的方法更加方便。 – UltraCommit