【问题标题】:Merge with more than one statement after WHEN MATCHEDWHEN MATCHED 后与多个语句合并
【发布时间】:2016-05-10 23:34:12
【问题描述】:

我熟悉 oracle 的 MERGE 语句,该语句通常用于 UPDATE ELSE INSERT。

我的问题是,它可以用来更新 + 插入日志表吗?
我想监控所有已更新的记录,所以我需要将它们保存在日志表中。因此,我不想再次从两个巨大的表中进行选择,而是想在 WHEN MATCHED 子句中放置另一个 INSERT 语句。 所以它会是这样的:

MERGE INTO tableA A
using TableB b
ON (a.Col = b.Col)
WHEN MATCHED THEN UPDATE SET A.col2 = b.col2
  INSERT INTO tableA_Log (key,col)
  VALUES (a.Key,b.col2) ;

这可能吗?还是我必须再次从两个表中再次查询(5 亿条记录和 4 千万条记录)。

提前致谢。

【问题讨论】:

  • 您最好为此使用普通更新和插入。

标签: sql oracle performance merge sql-update


【解决方案1】:

这可能吗?

不,不可能在单个 MERGE 语句中。

来自documentationMERGE的定义:

使用 MERGE 语句从一个或多个来源中选择行以进行更新或插入到表中或视图中。

这意味着您可以从多个源表中选择行,但一次只能更新或插入一个表,即。要合并的表。

您可以在表上创建一个更新后触发器,以便在基表中的行更新时将行插入到日志表中。

【讨论】:

  • 更新后触发器的问题在于,这是对这个表的 RETRO 修复,它在其他 1 个以上的地方进行更新,所以我只需要在这种情况下插入日志表..我不想从那些大桌子中选择两次,我会为你的努力投票支持你,但这仍然不是我需要的:(
  • @sagi 我能想到的唯一方法是在纯 SQL 中使用单独的 INSERT 语句。当然,您可以在 PL/SQL 中在单个事务中完成,但您需要一个纯 SQL 解决方案。
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多