ORACLE: создание уникальных значений без использования последовательности при мульти-вставках - PullRequest
0 голосов
/ 26 сентября 2018

Существует родительская таблица (MAIN_TABLE), и необходимо выполнить несколько вставок в дочернюю таблицу (CHILD_TABLE) для различных типов (TYPE_1 / TYPE_2 / TYPE_3 и т. Д.).То есть для записи с одним родителем у меня будет три дочерних, если есть три типа.

WITH MAIN_TABLE AS 
(
    SELECT 100 AS ID,'RICK' AS NAME,5 AS LINE FROM DUAL
    UNION ALL
    SELECT 101 AS ID,'TOM' AS NAME,6 AS LINE FROM DUAL
    )
SELECT * FROM MAIN_TABLE;
        ID NAME                       LINE
---------- -------------------- ----------
       100 RICK                          5
       101 TOM                           6

2 rows selected.

Нужно вставить родительскую запись в дочернюю таблицу, где для строки column она должна быть заполнена в возрастающейorder.

INSERT ALL
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_1')
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_2')
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_3')
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_4')
SELECT ID, NAME, LINE
  FROM MAIN_TABLE;  

SQL> SELECT * FROM CHILD_TABLE
       100 RICK                          5 TYPE_1    
       101 TOM                           6 TYPE_1    
       100 RICK                          5 TYPE_2    
       101 TOM                           6 TYPE_2    
       100 RICK                          5 TYPE_3    
       101 TOM                           6 TYPE_3    
       100 RICK                          5 TYPE_4    
       101 TOM                           6 TYPE_4    

8 rows selected.

Здесь, вместо 5,6 в качестве строки, мне нужно 5,6,7,8,9,10,11,12.Как это сделать?

Примечание: 1. Я не могу создать последовательность 2. Нет нескольких отдельных операторов вставки, если это возможно.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я, конечно, надеюсь, что это домашнее задание:

INSERT INTO CHILD_TABLE
SELECT m.ID,
       m.NAME,
       o.MIN_LINE + ROWNUM - 1 AS LINE,
       t.TYPE
  FROM MAIN_TABLE m
  CROSS JOIN (SELECT MIN(LINE) AS MIN_LINE FROM MAIN_TABLE) o
  CROSS JOIN (SELECT 'TYPE_1' AS TYPE FROM DUAL UNION ALL
              SELECT 'TYPE_2' AS TYPE FROM DUAL UNION ALL
              SELECT 'TYPE_3' AS TYPE FROM DUAL UNION ALL
              SELECT 'TYPE_4' AS TYPE FROM DUAL) t;

dbfiddle здесь

0 голосов
/ 26 сентября 2018

Я настоятельно рекомендую использовать последовательность Oracle, когда это возможно.Если вы по-прежнему ощущаете острую необходимость не использовать последовательность, попробуйте создать таблицы псевдопоследовательности и напишите некоторые функции PLSQL для выполнения вставок, выбрав доступную последовательность + 1.

Или вы можете сделать что-то вроде

создайте переменную для вашего текущего максимального значения и попробуйте использовать ROW_NUMBER() OVER (ORDER BY column_name)+@your_var, где @your_var= SELECT MAX(column_name) FROM child

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...