Oracle 12c-按顺序插入另一个表中的重复项

时间:2019-03-04 17:58:59

标签: sql oracle sql-insert

我有以下插入语句失败,并违反了ORA-00001唯一约束(这是PK违反)。 PK位于c_id,f_id上。

INSERT 
   INTO ab (c_id
          , d_amt
          , e_date
          , f_id)
   SELECT c_id
        , d_amt
        , e_date
        , (SELECT NVL(MAX(f_id) + 1,1) --this is causing the ORA-00001 error on duplicate c_id's
             FROM ab
            WHERE c_id = cx.c_id) f_id
     FROM xx cx

我的目标是将数据从xx插入到ab中,如果xx中有重复的c_id值,则insert语句应为第一个之后的每个重复项将f_id值增加1。

1 个答案:

答案 0 :(得分:0)

您可以将子查询更改为外部联接的内联视图,然后使用解析函数来递增:

INSERT 
   INTO ab (c_id
          , d_amt
          , e_date
          , f_id)
   SELECT cx.c_id
        , cx.d_amt
        , cx.e_date
        , NVL(ab2.f_id, 0) + ROW_NUMBER() OVER (PARTITION BY cx.c_id ORDER BY NULL)
     FROM xx cx
     LEFT JOIN (SELECT c_id, MAX(f_id) as f_id FROM ab GROUP BY c_id) ab2
     ON ab2.c_id = cx.c_id

db<>fiddle demo

ORDER BY NULL有点麻木;如果您关心插入行中的顺序,则可以按cx中可用的另一列中的一个或多个来排序。