2012-02-06 7 views
0

重複するPKエラーを取得する次のクエリがあります。 何が間違っていますか?Merge Insert主キーが違反しました

//////// EDIT PK = ITEM & LOC

MERGE INTO item_loc_traits il 
USING (
     SELECT item, loc, reward_eligible_ind 
     FROM (
       SELECT dc_vert.item , dc_vert.loc, dc_vert.actie, 
         dc_vert.reward_eligible_ind, 
         MAX(dc_vert.actie) over 
          (PARTITION BY dc_vert.item, dc_vert.loc) actie_max 
       FROM dc_item_loc_vert dc_vert 
       ) 
     WHERE actie = actie_max 
     ) dc_vert 
ON  il.item = dc_vert.item 
     AND il.loc = dc_vert.loc 
WHEN MATCHED THEN 
     UPDATE 
     SET  il.deposit_code = reward_eligible_ind 
     ,  il.last_update_datetime = SYSDATE; 
WHEN NOT MATCHED THEN 
     INSERT (item, loc, deposit_code, last_update_datetime, 
       last_update_ID, create_datetime) 
     VALUES (dc_vert.item, dc_vert.loc, dc_vert.reward_eligible_ind, 
       SYSDATE, 'CNVOBJ_SRC', SYSDATE); 
+0

主キーは何ですか?データを見ずに言うのは難しいです。簡単なreproのためにサンプルのテーブル作成作成スクリプトを投稿して、これを実行してクエリを修正できるようにします。 – Ash

答えて

2

特定item, locのマージ元の複数の行がprobabyあります。あなたは、次のクエリでこれをテストすることができます:

SELECT item, loc 
FROM (
     SELECT item, loc, reward_eligible_ind 
     FROM (
       SELECT dc_vert.item , dc_vert.loc, dc_vert.actie, 
         dc_vert.reward_eligible_ind, 
         MAX(dc_vert.actie) over 
          (PARTITION BY dc_vert.item, dc_vert.loc) actie_max 
       FROM dc_item_loc_vert dc_vert 
       ) 
     WHERE actie = actie_max 
     ) sub 
GROUP BY 
     item, loc 
HAVING count(*) > 1 

これは任意の行を返した場合、あなたのmergewhen not matched一部が同じitem, loc組み合わせで複数の行を挿入しようとします。これにより、主キー違反が発生します。

SELECT item, loc, reward_eligible_ind 
     FROM (
       SELECT dc_vert.item , dc_vert.loc, dc_vert.actie, 
         dc_vert.reward_eligible_ind, 
         MAX(dc_vert.actie) over 
          (PARTITION BY dc_vert.item, dc_vert.loc) actie_max 
       FROM dc_item_loc_vert dc_vert 
       ) 
     WHERE actie = actie_max 

0

クエリはdc_vert.itemとdc_vert.loc同じ組み合わせのための複数の値を返しています。 例えば5を2倍にした場合、最初の行が挿入され、2番目の行が挿入されます。元のデータソースと比較されるため、ちょうど挿入された行が表示されません。

関連する問題