用于插入新数据和更新现有数据的DB2 SQL语句

时间:2014-07-15 20:53:34

标签: sql db2

我在这个问题上发现了很多不幸的事。这么多相似但不太正确的场景。毫无疑问,我的无知将在这里闪耀。

使用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中尝试更新的相关行。该表本身相当非结构化,但是是更大数据模型的一部分。

1 个答案:

答案 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);

这是对的吗?