有一个父表(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语句。
答案 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;