我有一个带有两个事实表和几个维度表的星型模式。我想将其中一个事实更新为两个事实表中的事实总和。假设我有以下数据:
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吗?任何帮助都将非常感激。
答案 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
。