Oracle从多个表更新

时间:2015-04-28 22:30:43

标签: oracle sql-update

我有一个带有两个事实表和几个维度表的星型模式。我想将其中一个事实更新为两个事实表中的事实总和。假设我有以下数据:

Fact1:
Val1|Dim1|Dim2|Dim3|RunNB
100 |1   |2   |3   |1
200 |1   |2   |4   |1
101 |1   |2   |3   |2 

Fact2:
Val2|Val3|Dim1|Dim2|Dim3|RunNB
100 |0   |1   |2   |3   |3
200 |0   |1   |2   |4   |3
101 |0   |1   |2   |3   |4

Run:
RunNB|Date
1    |20150423
2    |20150428
3    |20150423

我想用Fact1.Val1 + Fact2.Val2填充Fact2.Val3,对于尺寸匹配的所有行,与运行相关的日期是相同的。

以下查询选择正确的数据:

select Fact1.Val1 + Fact2.Val2
from Fact1, Fact2, Run r1, Run r2
where Fact1.Dim1 = Fact2.Dim1 AND
      Fact1.Dim2 = Fact2.Dim2 AND
      Fact1.Dim3 = Fact3.Dim3 AND
      Fact1.RunNB = r1.RunNB AND
      r1.Date = '20150423' AND
      Fact2.RunNB = r2.RunNB AND
      r2.Date = '20150423';

我需要选择总和,然后用总和更新相应的Fact2.Val3。我在构建更新语句时遇到了问题。

我的理解是甲骨文不支持:

update x
set y
FROM z
where q

我也试过了:

update (
  select ...
) set ...

语法,但我无法正常工作。我可以使用MERGE吗?任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

这个merge语句适用于给定的例子:

merge into (select * from fact2 
  where runnb in (select runnb from run where rDate = '20150423')) f2
using (  
  select dim1, dim2, dim3, run.runnb, val1 
    from fact1 join run on fact1.runnb = run.runnb and rDate = '20150423' ) f1
on (f1.dim1 = f2.dim1 and f1.dim2 = f2.dim2 and f1.dim3 = f2.dim3) 
when matched then update set f2.val3 = f1.val1 + f2.val2;

如果表格fact1中dim1,dim2,dim3的行数多于一天,则必须先将它们分组并在using部分中求和, 否则可能会出现错误无法获得稳定的行集。 顺便说一句 - 我在表date中将rdate重命名为run