合并sql抛出唯一约束违反错误

问题描述

当我查询表 TEST_RUA 时,我有以下两个表:

select  CLASS,ID_LL,ID_UU,TKR from TEST_RUA   where ID_UU= 'GV9999B12M0'

它返回:

CLASS    ID_LL   ID_UU          TKR
Bond    (null)  GV9999B12M0     WIB

当我查询表 TEST_RUA_MER 时:

select CLASS,TKR from TEST_RUA_MER   where ID_UU= 'GV9999B12M0'

它返回:

CLASS    ID_LL   ID_UU          TKR
Bond    (null)  GV9999B12M0     WIB

您可以看到表中的两个值相同,其中 ID_UU= 'GV9999B12M0'。表 TEST_RUA_MER 在列 ID_LL,TKR 上具有唯一索引。

现在我有下面的合并查询,它抛出错误ORA-00001: unique constraint violated,我不明白如何避免这个错误,因为两个表值都相同,那么在这种情况下,这个合并查询应该尝试更新而不是插入在表 TEST_RUA_MER 中。

merge into TEST_RUA_MER h   using  (    
select distinct r.CLASS,r.ID_LL,r.ID_UU,r.TKR from TEST_RUA r   ) s 
on (s.ID_LL=h.ID_LL and s.ID_UU=h.ID_UU  and s.TKR=h.TKR) when matched then   
update set h.CLASS = s.CLASS,h.ID_LL = s.ID_LL,h.ID_UU = s.ID_UU,h.TKR = s.TKR
when not matched then   insert values (s.CLASS,s.ID_LL,s.ID_UU,s.TKR);

解决方法

看起来像 NULL 导致问题;它不“等于”任何东西,所以:

on (s.ID_LL=h.ID_LL 

失败。

试试

on (nvl(s.ID_LL,-1) = nvl(h.ID_LL,-1)

(取决于 ID_LL 列的数据类型是什么;我假设它是一个数字)。

,

是的,正如另一个答案中所提到的,错误的原因是 s.ID_LL=h.ID_LL。您可以将其更新为

( s.ID_LL=h.ID_LL OR (s.ID_LL is null and h.ID_LL is null) )

( s.ID_LL=h.ID_LL OR coalesce(s.ID_LL,h.ID_LL) is null )