合并插入违反主键
所以我有以下查询,该查询出现 Duplicate PK 错误 我做错了什么?
/////////////// 编辑 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);
So I have the following query which gets a Duplicate PK error
what am I doing wrong?
////////
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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于特定的项目 loc,合并源中可能有多行。您可以使用以下查询对此进行测试:
如果返回任何行,则
merge
的when not match
部分将尝试插入具有相同item 的多行, loc 组合。这将导致主键违规。
There are probaby multiple rows in the merge source for a particular
item, loc
. You could test this with the following query:If this returns any rows, the
when not matched
part of yourmerge
will try to insert multiple rows with the sameitem, loc
combination. That would result in a primary key violation.您的查询
为 dc_vert.item 和 dc_vert.loc 的同一组合返回多个值。
例如,如果有两次 5、10,第一行将被插入,第二行将看不到刚刚插入的行,因为它将与原始数据源进行比较
your query
is returning more than one value for the same combination of dc_vert.item AND dc_vert.loc.
If you have twice 5, 10 for example, the first line will be inserted and the second wont see the one that was just inserted because it will be comparing with the original data source