合并来自另一个 table 的数据时违反主键
Primary key violation while merging data from another table
我有两个表,TBTC03 和 TBTC03Y,TBTC03Y 有两个额外的列,分别是 EFFDTE 和 EXPDTE。我必须使用以下逻辑将数据从 TBTC03 合并到 TBTC03Y:
如果在 TC03Y 中找不到匹配的 TC03 条目
一个新的 TC03Y 记录是用 TC03 数据构建的
生效日期将默认为“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 记录,其中已经有带主键的数据。
触发上述查询会在某些行上提供主键约束。
我无法弄清楚如何完成它。
如果两个表的 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
但是插入会明显违反 t2
中的 PK
约束:
t2{LOB, MAJPERIL, LOSSCAUSE}
1 1 1
主键的问题在于您还在 WHERE 子句中包含了 NUMERICCL。如果删除它,您将插入唯一数据。
您可能必须创建一个单独的流程,因为您似乎在每个 table 中都有一些记录具有相同的 LOB、MAJPERIL 和 LOSSCAUSE 但具有不同的 NUMERICCL。我可以在这里想到三个选项;
- 您的数据有问题需要修复。
- 也许您想更新此值以匹配,在这种情况下您正在查看 UPDATE 而不是 INSERT INTO。
- 您需要更新复合主键以包含 NUMERICCL 列。
- 从 where 子句中删除 NUMERICCL 也会更正此问题。
我有两个表,TBTC03 和 TBTC03Y,TBTC03Y 有两个额外的列,分别是 EFFDTE 和 EXPDTE。我必须使用以下逻辑将数据从 TBTC03 合并到 TBTC03Y:
如果在 TC03Y 中找不到匹配的 TC03 条目
一个新的 TC03Y 记录是用 TC03 数据构建的
生效日期将默认为“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 记录,其中已经有带主键的数据。
触发上述查询会在某些行上提供主键约束。 我无法弄清楚如何完成它。
如果两个表的 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
但是插入会明显违反 t2
中的 PK
约束:
t2{LOB, MAJPERIL, LOSSCAUSE}
1 1 1
主键的问题在于您还在 WHERE 子句中包含了 NUMERICCL。如果删除它,您将插入唯一数据。
您可能必须创建一个单独的流程,因为您似乎在每个 table 中都有一些记录具有相同的 LOB、MAJPERIL 和 LOSSCAUSE 但具有不同的 NUMERICCL。我可以在这里想到三个选项;
- 您的数据有问题需要修复。
- 也许您想更新此值以匹配,在这种情况下您正在查看 UPDATE 而不是 INSERT INTO。
- 您需要更新复合主键以包含 NUMERICCL 列。
- 从 where 子句中删除 NUMERICCL 也会更正此问题。