sql合并重复记录

ezykj2lf  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(1413)

我正在尝试合并DB2SQL中的两个表,它不断向我提供sql状态21506和错误消息sql0788。
到目前为止,我的情况是:

merge into table1 as tgt
using table2 as src
on src.key1 = tgt.key1 and src.key2 = tgt.key2
when matched then
   update set
      (fld1, fld2, fld3) = (src.fld1, src.fld2, src.fld3)
when not matched then
   insert (fld1, fld2, fld3) values (src.fld1, src.fld2, src.fld3)

我搜索了这样的复制品:

select src.key1, src.key2, count(*)
from table1 as tgt
inner join table2 as src on tgt.key1 = src.key1 and tgt.key2 = src.key2
group by src.key1, src.key2
having count(*) > 1

没有(重复)记录返回。我错过了什么?

ddhy6vgd

ddhy6vgd1#

sqlstate 21506意味着
为merge语句的update、delete或insert操作多次标识了目标表的同一行。
所以在src中有两行有相同的键。。。
你不能用这句话找到他们

select src.key1, src.key2, count(*)
from table1 as tgt
inner join table2 as src on tgt.key1 = src.key1 and tgt.key2 = src.key2
group by src.key1, src.key2
having count(*) > 1

因为内部连接,这意味着表2中的重复行在表1中没有匹配项。
这应该给你看。。

select src.key1, src.key2, count(*)
from table2 as src
group by src.key1, src.key2
having count(*) > 1
sshcrbum

sshcrbum2#

所以问题出在 update .
而不是:

update set
   (fld1, fld2, fld3) = (src.fld1, src.fld2, src.fld3)

这样做:

update set
   fld1 = src.fld1,
   fld2 = src.fld2,
   fld3 = src.fld3

在没有改变其他任何东西的情况下,这起作用了,为什么?还是不知道。。。

相关问题