Oracle 12c - вставить дубликаты с последовательностью из другой таблицы - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий оператор вставки, который не выполняется с нарушением уникального ограничения 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, то оператор вставки должен увеличивать значение f_id на 1 для каждогодублировать после первого.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете изменить свой подзапрос на встроенное представление, к которому вы присоединяетесь, а затем использовать аналитическую функцию для увеличения:

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

* * * * * * * * * * * * '*' 'немного не в себе;если вам важно, какая последовательность находится во вставленных строках, вы можете упорядочить по одному или нескольким другим столбцам, доступным из cx.

...