我想将值从一个表插入到另一个表中,但第一个表的值存储在一个字符串中,以逗号分隔。 我必须自动插入所有值而不指定id,因此创建以下内容。
TABLE_1
ID_TRA | COND
------------
100 | 1,2,4
101 | 4
102 | 1, 16 <--- TRIM SPACE
TABLE_2
ID | ID_TRA | COND_ID
---------------------
1 | 100 | 1
2 | 100 | 2
3 | 100 | 4
4 | 101 | 4
5 | 102 | 1
6 | 102 | 16
注意
ID必须在插入
时自动递增答案 0 :(得分:1)
你可以这样使用insert-select:
insert into table_2(ID, ID_TRA, COND_ID)
SELECT ROWNUM, ID_TRA, COND_ID
FROM (
SELECT ID_TRA,
trim (' ' from REGEXP_SUBSTR( COND, '([^,]*)(,|$)', 1, LEVEL, NULL, 1 ) ) AS COND_ID
FROM table_1 t
CONNECT BY
ID_TRA = PRIOR ID_TRA
AND PRIOR SYS_GUID() IS NOT NULL
AND LEVEL < REGEXP_COUNT( COND, '([^,]*)(,|$)' )
ORDER BY 1, 2
)
排序很重要,可以决定如何在表格中分配ID
;您可以通过修改ORDER BY
来修改它。
拆分字符串的方法取自SO documentation。
如果您需要向table_2
添加新行,而不是从头开始填充,则最好使用序列; rownum
的解决方案仅在目标表为空时才有效。
答案 1 :(得分:0)
试试这个:
insert into table_2(ID, ID_TRA, cond)
select rownum,id_tra,trim(regexp_substr(t.cond, '[^,]+', 1, levels.column_value)) as prjcd from table_1 t,
table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.cond, '[^,]+')) + 1) as sys.OdciNumberList)) levels;