【问题标题】:Can we run merge(Oracle) query more than once when source does not change当源不改变时,我们可以多次运行合并(Oracle)查询吗
【发布时间】:2012-07-03 14:42:47
【问题描述】:

我正在使用以下查询,

MERGE INTO table2 b
     USING (
         SELECT column1,column2,column3
         FROM table1
     ) a
     ON (a.column3 = 'UPDATE')
     WHEN NOT MATCHED THEN
         INSERT (b.column1, b.column2) VALUES (a.column1,a.column2)
     WHEN MATCHED THEN
         UPDATE SET a.column1 = b.column1,a.column2=b.column2;

当 table2 为空时,它第一次成功运行。 如果我第二次运行,即使 table1 数据没有更改,我也会收到unable to get a stable set of rows in the source tables 的错误。是否有解决此错误的方法。

正如thread 中提到的,我尝试放置Distinct,但它没有解决..

我认为rowid应该解决这里的目的..但不确定

谢谢

【问题讨论】:

标签: sql oracle


【解决方案1】:

ON (a.column3 = 'UPDATE') 不够用。

您需要说明这两个表是如何相互关联的。这很重要,因此:
- Table1 中的给定行匹配 Table2 中的一行 (UPDATE)
- 或者,Table1 中的给定行在 Table2 中没有匹配 (INSERT)

这意味着ON 子句必须将两个表以 1:1 或 1:0 的比例匹配在一起。从来没有很多:很多。在下面的代码中,我将假设 column1 是唯一标识符。如果是这种情况,则符合 1:1 的要求。

如果您无法唯一标识每个表中的每一行,那么您需要更改数据以便能够做到这一点。

MERGE INTO
  table2 b
USING (
  SELECT column1,column2,column3
  FROM table1
) a
ON (
  b.column1 = a.column1
)
WHEN NOT MATCHED THEN
  INSERT (b.column1, b.column2) VALUES (a.column1,a.column2)
WHEN MATCHED THEN
  UPDATE SET b.column2 = a.column2; 

请注意,我在这里没有使用 UPDATE 值,因为它似乎没有必要(您可以提供更多信息来解释它的原因) .

相反,对于table1 中的每一行,这会在table1 中搜索具有column1 中相同值的行。如果找到NOT,则执行INSERT。如果找到一个IS,则执行更新。


你一直在做的是说找到匹配项 if (a.column3 = 'UPDATE')。这意味着 table2 中的每一行都与 table1 中的每一 'UPDATE' 行匹配 - 使其尝试使用 @ 中 many 行中的值更新 table2 中的同一行987654336@.

然后,a.column3 <> 'UPDATE' 将插入到table2 中的每一行。

【讨论】:

  • 我正要写,当我决定验证自己是否 Oracle MERGE 有 WHEN NOT MATCHED BY SOURCE 子句时,也应该提到 0:1 匹配。我很惊讶竟然没有一个,更何况doc page说声明'让你避免多个INSERTUPDATEDELETE DML 语句'。但它继续揭示在 Oracle MERGE 中实际上没有 DELETE 子句!我想知道你是否知道我可能在这里遗漏的东西。否则文档似乎是矛盾的
  • @AndriyM 有一个 delete 子句,但它似乎是 UPDATE 部分的一部分,而且我发现它的用处非常有限。
  • @MikeMeyers:啊,我忽略了这一点。显示我阅读这篇文章的仔细程度(更有可能是“略读”)。谢谢!
  • 非常感谢 Dems,我弄清楚了两个表之间的共同点并解决了问题..
猜你喜欢
  • 2021-07-18
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 2021-11-10
  • 2019-08-25
  • 2013-01-14
相关资源
最近更新 更多