2012-02-06 39 views
0

所以我有以下查询获取重复PK错误 我做错了什么?合并插入主键违反

//////// 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

主键是什么?没有查看数据很难说。为了便于重新发布示例表创建创建脚本,以便可以运行此操作并修复查询。 – Ash 2012-02-06 14:25:06

回答

2

有probaby在合并源多行特定item, loc。如果返回任何行,你mergewhen not matched部分将尝试用相同的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 

:你可以用下面的查询进行测试。这会导致主键违规。

0

查询

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例如,第一行将被插入,第二行不会看到刚插入的,因为它会与原始数据源进行比较