Oracle Merge:使用源表中的多个记录更新基表中的单个记录

时间:2017-06-22 14:00:39

标签: oracle sql-merge

我有一个合并查询,如下所示:

.right_col {
  min-height: 647px;
  display: flex;
}

.fill {
  flex: 1;
  background: gray;/* see me */
  box-sizing: border-box;
}

现在它给我一个错误:无法在源表中获得一组稳定的行

现在问题是源表table2具有相同column1值的多个记录,而table1每个column1值只有一个记录。我需要所有table2来更新table1。你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

  

"问题是源tabletable2,具有相同column1值的多个记录"

您需要确保您的子查询每个column1值只返回一行。只有您知道需要应用的确切业务规则,但它可能是这样的:

merge into table1
using ( select column1, max(column2) as column2
        from table2
        group by column1 ) t2
on (table1.column1 = t2.column1)
when matched then
update
set column2 = t2.column2;
  

"我需要table2中的所有记录来更新table1。原因是我在table1上有一个触发器,它捕获所有事务(插入/更新)并加载到另一个历史表。 "

您无法使用MERGE。事实上,你可能不得不采取程序性行动:

begin
    for t2rec in (select column1, column2
                  from table2
                  order by column1, column2 )
    loop
       update table1 
       set column2 = t2rec.column2
       where column1 = t2rec.column1;
    end loop;
end;

您需要订购循环语句,以确保table1的结束状态正确。

或者,您可以禁用日记触发器并执行此操作:

insert into table1_journal
select table1.column1
       , table2.column2
from table1 
     join table2 
     on  table1.column1 = table2.column1
/

然后执行MERGE或单行更新。