2016-08-09 6 views
2

Я хочу вставить значения в столбце из одной таблицы в другую, но значения первой таблицы хранятся в одной строке, разделенной запятыми. Я должен автоматически вставлять все значения без указания идентификатора, следовательно, создавая следующее.Вставить разделимые значения из списка, разделенного запятой

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 

Примечание

Идентификатор должен быть автоматически увеличивается, как это вставляется

+3

Никогда, никогда не хранить данные в виде значений, разделенных запятыми. Это вызовет у вас массу проблем. – jarlh

+0

Значения были так, когда они прислали мне эту функциональность –

+0

И вам нужно иметь дело с этим ... Слишком плохо. – jarlh

ответ

1

Вы можете использовать вставку-выбрать этот путь:

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 работает только в том случае, если целевая таблица пуста.

+0

Спасибо за всех друзей. –

+0

Если я поставил последовательность на избранный элемент, не работаю? вставки в table_2 (ID, ID_TRA, COND_ID) ВЫБРАТЬ MY_SQ.nextval, ID_TRA, COND_ID FROM (SELECT, ID_TRA, обшивкой (» 'от REGEXP_SUBSTR (COND' ([^,] *) (, | $) '1, УРОВЕНЬ, NULL, 1)) КАК COND_ID ОТ table_1 т CONNECT BY ID_TRA = Предшествующий уровень ID_TRA и предшествующий уровень SYS_GUID() НЕ IS NULL И УРОВЕНЬ

+0

Если вам нужна последовательность, просто используйте your_sequence.nextVal вместо ROWNUM во внешнем запросе – Aleksej

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; 
Смежные вопросы