gpt4 book ai didi

sql - 当源未更改时,我们可以多次运行 merge(Oracle) 查询吗

转载 作者:行者123 更新时间:2023-12-02 05:38:45 25 4
gpt4 key购买 nike

我正在使用下面的查询,

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 数据未更改,我也会收到错误,因为无法在源表中获取一组稳定的行..是否有解决此错误的方法.

如本thread所述, 我试着把 Distinct 但它没有解决..

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

谢谢

最佳答案

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

您需要说明这两个表之间的关系。这很重要,因此:
- 表 1 中的给定行与表 2 中的一行匹配 (UPDATE)
- 或者,Table1 中的给定行在 Table2 中没有匹配项 (INSERT)

这意味着 ON子句 must 将两个表以 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被执行。如果找到 IS,则执行更新。


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

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

关于sql - 当源未更改时,我们可以多次运行 merge(Oracle) 查询吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11304538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com