2

我正在使用以下查询,

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消息。是否有解决此错误的方法。

正如在这个线程中提到的,我尝试放置Distinct但它没有解决..

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

谢谢

4

1 回答 1

5

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

您需要说明这两个表是如何相互关联的。这很重要,以便:
- 表 1 中的给定行匹配表 2 中的一行(更新)
- 或者,表 1 中的给定行在表 2 中没有匹配(插入)

这意味着该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。如果没有找到,INSERT则执行。如果找到一个则执行更新。


你一直在做的是说如果(a.column3 = 'UPDATE')找到匹配项。这意味着 in 中的每一行都与 in 中每一行相table2匹配——使其尝试使用.'UPDATE'table1table2table1

然后,每行将a.column3 <> 'UPDATE'被插入到table2.

于 2012-07-03T05:54:28.617 回答