当源没有改变时,我们可以多次运行合并(Oracle)查询

时间:2012-07-03 04:35:06

标签: sql oracle

我使用以下查询,

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应该解决目的......但不确定

由于

1 个答案:

答案 0 :(得分:5)

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 ,则执行更新。


你所做的是说如果(a.column3 = 'UPDATE')找到匹配。这意味着table2中的每一行都与'UPDATE'中的每个table1行匹配 - 使其尝试使用中的值更新table2中的同一行table1中的许多行。

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