代码之家  ›  专栏  ›  技术社区  ›  1pluszara

Oracle:创建唯一值而不使用sequence while multi insert

  •  0
  • 1pluszara  · 技术社区  · 6 年前

    有一个父表( MAIN_TABLE )需要在子表中进行多次插入( CHILD_TABLE ) 对于各种类型(类型_1/类型_2/类型_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。如果可能,没有多个单独的insert语句。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Bob Jarvis - Слава Україні    6 年前

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

    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

        2
  •  1
  •   Srini V    6 年前

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

    或者你可以做点什么

    为当前最大值创建变量并尝试使用 ROW_NUMBER() OVER (ORDER BY column_name)+@your_var 在哪里? @your_var= SELECT MAX(column_name) FROM child