マージ挿入の主キーが違反しました

だから私は重複PKエラーを取得する次のクエリを持っている 私は何を間違えているのですか?

//////// EDIT The 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 のマージソースには複数の行があります。あなたは次のクエリでこれをテストすることができます:

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

これにより行が返された場合、 merge 一致しない場合は item、loc の組み合わせで複数の行を挿入しようとします。これにより、主キー違反が発生します。

2
追加された

あなたの質問

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.itemとdc_vert.locの同じ組み合わせに対して複数の値を返しています。 例えば5倍、10倍の場合、最初の行が挿入され、元のデータソースと比較されるため、挿入されたばかりの行は表示されません

0
追加された