我有两个表TBTC03和TBTC03Y,TBTC03Y有两个额外的列,如EFFDTE和EXPDTE。我必须使用以下逻辑将TBTC03中的数据合并到TBTC03Y:
如果在TC03Y中找不到匹配的TC03条目
使用TC03数据构建新的TC03Y记录
生效日期默认为'01 -01-1980'
到期日期默认为'09 -30-1995'
我写了一个查询:
insert into TBTC03Y (LOB,MAJPERIL,LOSSCAUSE,NUMERICCL,EFFDTE,EXPDTE)
select LOB,MAJPERIL,LOSSCAUSE,NUMERICCL,'0800101' ,'0950930'
from TBTC03 where not EXISTS (select * from TBTC03Y where
TBTC03Y.LOB = TBTC03.LOB AND
TBTC03Y.MAJPERIL = TBTC03.MAJPERIL AND
TBTC03Y.LOSSCAUSE = TBTC03.LOSSCAUSE AND
TBTC03Y.NUMERICCL = TBTC03.NUMERICCL)
两个表的主键是LOB,MAJPERIL和LOSSCAUSE。
但是我有一些TBTC03Y记录,已经有主键的数据。
触发上述查询会在某些行上产生主键约束。 我无法弄清楚如何才能完成它。
答案 0 :(得分:3)
如果两个表的PK
均为{LOB, MAJPERIL, LOSSCAUSE}
,则应从where子句中删除TBTC03Y.NUMERICCL = TBTC03.NUMERICCL
。
示例:
t1{LOB, MAJPERIL, LOSSCAUSE, NUMERICCL}
1 1 1 1
t2{LOB, MAJPERIL, LOSSCAUSE, NUMERICCL}
1 1 1 2
在t2
中没有行:
TBTC03Y.LOB = TBTC03.LOB AND
TBTC03Y.MAJPERIL = TBTC03.MAJPERIL AND
TBTC03Y.LOSSCAUSE = TBTC03.LOSSCAUSE AND
TBTC03Y.NUMERICCL = TBTC03.NUMERICCL
但是,PK
中的插入会违反t2
约束:
t2{LOB, MAJPERIL, LOSSCAUSE}
1 1 1
答案 1 :(得分:3)
主键的问题是您还在WHERE子句中包含NUMERICCL。如果你删除它,你将插入唯一的数据。
您可能需要创建一个单独的进程,因为看起来每个表中有一些记录具有相同的LOB,MAJPERIL和LOSSCAUSE但具有不同的NUMERICCL。我可以在这里想到三个选项;