Oracle从多个表更新

Oracle从多个表更新,oracle,sql-update,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

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

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语句时遇到问题

我的理解是Oracle不支持:

update x
set y
FROM z
where q
我还尝试了以下方法:

update (
  select ...
) set ...

语法,但我不能让任何东西工作。我可以用MERGE吗?非常感谢您的帮助。

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的行数多于一行,则必须首先在
中使用
部分对这些行进行分组和汇总, 否则,可能会出现无法获取稳定行集的错误。
顺便说一句,我在表
run

中将
date
重命名为
rdate
,这似乎是一个糟糕的数据模型。具有两个事实表的星型模式不是真正的星型模式。但是两个维度相同的事实表和相关事实?肯定很臭。此外,如果事实数据表包含正确的仓库卷,则不希望对其运行更新语句(包括合并)。同意。我试图做的任务毫无意义。然而,由于各种遗留原因,我需要这样做。我既不能更改数据模型,也不能更改需求。你对我如何做到这一点有什么想法吗?谢谢。当我实现这一点时,我得到以下Oracle错误:
错误报告:SQL错误:ORA-30926:无法在源表30926中获得一组稳定的行。00000-“无法在源表中获取稳定的行集”*原因:由于dml活动较大或where子句不确定,无法获取稳定的行集*操作:删除任何不确定的where子句并重新发出dml。
我的真实数据集比示例中的要大得多,但两个select语句返回相同数量的记录,没有重复。关于这个问题有什么想法吗?更新:我想我看到了ORA-30926错误的根本原因。实际上,由于数据规范化方面的一些问题,有一些重复(160000条记录中大约有10条)。我怀疑查询将在没有这些错误的情况下运行。。。谢谢。正如我警告过你的-这个错误意味着对于某些行,在
fact1
中存在相同的重复项(dim1、dim2、dim3、日期)。在这里,我重现了这种情况,您可以从小提琴上运行查询来检查您的数据。要使
merge
正常运行,此查询不应返回任何行。我在
fact1
中添加了一行,其中val1=201。现在
merge
(或我)不知道它必须使用哪一行。解决方案是在内部查询中对数据进行分组,但我不知道您是否需要这样做。或者消除欺骗。