我使用以下查询,
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
应该解决目的......但不确定
由于
答案 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
的每一行。