合并来自另一个表的数据时发生主键冲突

时间:2016-04-19 11:09:29

标签: sql sql-server tsql sql-insert sql-merge

我有两个表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记录,已经有主键的数据。

触发上述查询会在某些行上产生主键约束。 我无法弄清楚如何才能完成它。

2 个答案:

答案 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。我可以在这里想到三个选项;

  1. 您需要修复的数据存在问题。
  2. 也许您想要更新此值以匹配,在这种情况下,您正在查看UPDATE而不是INSERT INTO。
  3. 您需要更新复合主键以包含NUMERICCL列。
  4. 从where子句中删除NUMERICCL也会更正此问题。