合并插入违反主键

发布于 2025-01-03 02:02:23 字数 1049 浏览 2 评论 0原文

所以我有以下查询,该查询出现 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦初启 2025-01-10 02:02:23

对于特定的项目 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

如果返回任何行,则 mergewhen 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:

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

If this returns any rows, the when not matched part of your merge will try to insert multiple rows with the same item, loc combination. That would result in a primary key violation.

北恋 2025-01-10 02:02:23

您的查询

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

your query

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文