我在这个问题上发现了很多不幸的事。这么多相似但不太正确的场景。毫无疑问,我的无知将在这里闪耀。
使用DB2和一堆知识,我的场景如下:
在表格中,如果给定列中不存在给定值,则插入一行数据;如果值 ,则更新相应的行。
我有一张桌子
id, bigint, not nullable
ref,varchar, nullable
我不确定MERGE是否是正确的路径,因为大多数示例和彻底讨论似乎都围绕将一个表合并到另一个表中。我只是收集用户输入并添加或更新。看起来它应该非常简单。
我使用jdbc和prepared语句来完成这项工作。
MERGE是否是正确的方法?
在DB2 Control Center中测试我的查询时,我遇到了
"没有找到FETCH,UPDATE或DELETE的行;或者结果 查询是一个空表"
或其他各种错误取决于我如何构建MERGE。这就是我现在所拥有的。
merge into table1 as t1
using (select id from table1 group by id) as t2
on t1.id = t2.id
when matched then update set t1.ref = 'abc'
when not matched then insert (t1.id, t1.ref) values (123, 'abc');
如果我而撰写更新,然后是插入;对于新数据,插入运行并且更新失败,并且对于现有数据,它们都成功导致表中的数据不良,例如,两个相同的行。
如果最初使用值为
,则需要的结果id = 1
ref = a
添加了一个新行。在后续使用时,如果值更改为:
id = 1
ref = b
更新id = 1的行。后续使用将遵循相同的规则。
请让我知道如何更好地表达这个问题。
更新 ID不是自动递增键。它是一个独特的外部密钥,但并非我们引用的所有内容都需要在表I中尝试更新的相关行。该表本身相当非结构化,但是是更大数据模型的一部分。
答案 0 :(得分:4)
我对您的查询感到有些困惑。阅读文本让我怀疑你想要这样的东西:
merge into table1 as t1
using ( values (123, 'abc') ) as t2 (id, ref)
on t1.id = t2.id
when matched then update
set t1.ref = t2.ref
when not matched then
insert (id, ref) values (t2.id, t2.ref);
这是对的吗?