我有以下插入语句失败,并违反了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。
答案 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
ORDER BY NULL
有点麻木;如果您关心插入行中的顺序,则可以按cx
中可用的另一列中的一个或多个来排序。