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

Merge sql throws Unique constraint violation error

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

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

它returns:

CLASS    ID_LL   ID_UU          TKR
Bond    (null)  GV9999B12M0     WIB

当我查询时 table TEST_RUA_MER:

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

它returns:

CLASS    ID_LL   ID_UU          TKR
Bond    (null)  GV9999B12M0     WIB

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

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