ORACLE:在多次插入时无需使用序列即可创建唯一值

时间:2018-09-25 21:18:46

标签: sql oracle

有一个父表(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必须以递增顺序填充。

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,7,8,9,10,11,12,而不是5,6。 该怎么办?

注意:1.我无法创建序列。2.如果可能,没有多个单独的inserts语句。

2 个答案:

答案 0 :(得分:1)

我强烈建议尽可能使用Oracle序列。如果您仍然强烈希望不使用序列,请尝试构建伪序列表,并通过选择可用序列+ 1编写一些PLSQL函数来执行插入。

或者您可以做类似

的操作

为您的当前最大值创建一个变量,并尝试使用ROW_NUMBER() OVER (ORDER BY column_name)+@your_var,其中@your_var= SELECT MAX(column_name) FROM child

答案 1 :(得分:1)

我当然希望这是一项家庭作业:

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 here