3

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

触发上述查询会在某些行上提供主键约束。我无法弄清楚我该如何完成它。

4

2 回答 2

3

如果PK两个表的 都是{LOB, MAJPERIL, LOSSCAUSE},则应TBTC03Y.NUMERICCL = TBTC03.NUMERICCL从 where 子句中删除。

例子:

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 
于 2016-04-19T11:17:04.160 回答
3

主键的问题是您还在 WHERE 子句中包含了 NUMERICCL。如果您删除它,您将插入唯一数据。

您可能必须创建一个单独的进程,因为每个表中都有一些记录具有相同的 LOB、MAJPERIL 和 LOSSCAUSE,但具有不同的 NUMERICCL。我可以在这里想到三个选项;

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