问题描述
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 )