3

TBTC03 と TBTC03Y の 2 つのテーブルがあり、TBTC03Y には EFFDTE と EXPDTE として 2 つの余分な列があります。次のロジックを使用して、TBTC03 から TBTC03Y にデータをマージする必要があります。

一致する TC03 エントリが TC03Y に見つからない場合
、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

主キーの問題は、WHERE 句に NUMERICCL も含めていることです。これを削除すると、一意のデータが挿入されます。

各テーブルに同じ LOB、MAJPERIL、および LOSSCAUSE を持ち、NUMERICCL が異なるいくつかのレコードがあるように見えるため、別のプロセスを作成する必要がある場合があります。ここで 3 つのオプションを考えることができます。

  1. 修正が必要なデータに問題があります。
  2. この値を一致するように更新したい場合があります。その場合、INSERT INTO ではなく UPDATE を調べています。
  3. 複合主キーを更新して列 NUMERICCL を含める必要があります。
  4. where 句から NUMERICCL を削除すると、これも修正されます。
于 2016-04-19T11:19:17.090 に答える
3

PK両方のテーブルの が である場合は、where 句から{LOB, MAJPERIL, LOSSCAUSE}削除する必要があります。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 
于 2016-04-19T11:17:04.160 に答える