2016-08-09 82 views
2

Ich möchte die Werte in einer Spalte von einer Tabelle in eine andere einfügen, aber die Werte der ersten Tabelle werden in einer einzigen Zeichenfolge gespeichert, getrennt durch Kommas. Ich muss alle Werte automatisch einfügen, ohne die ID anzugeben, wodurch Folgendes erstellt wird.Einfügen von geteilten Werten aus kommagetrennten Listen

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 

Hinweis

Die ID Auto werden muss erhöht, wie es

eingefügt wird wird
+3

Nie, nie Speichern von Daten als kommagetrennte Werte. Es wird dir nur viel Ärger machen. – jarlh

+0

Die Werte waren so, als sie mir diese Funktionalität schickten –

+0

Und du musst damit umgehen ... Schade. – jarlh

Antwort

1

Sie einen verwenden können Insert-wählen Sie diese Art und Weise:

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 
     ) 

Die Reihenfolge ist wichtig, zu entscheiden, wie man die ID in Ihrer Tabelle einsetzt; Sie können es bearbeiten, indem Sie die ORDER BY ändern. Der Weg, um die Strings zu teilen, ist von SO documentation übernommen.

Wenn Sie dem table_2 neue Zeilen hinzufügen müssen, die nicht von Grund auf neu gefüllt werden, sollten Sie besser eine Sequenz verwenden; Die Lösung mit rownum funktioniert nur, wenn die Zieltabelle leer ist.

+0

Danke für alle Freunde. –

+0

Wenn ich Sequenz auf select stament nicht arbeiten? Einsatz in table_2 (ID, ID_TRA, COND_ID) SELECT MY_SQ.nextval, ID_TRA, COND_ID FROM ( SELECT ID_TRA, trim (‘ 'von REGEXP_SUBSTR (COND' ([^,] *) (, | $) '1, LEVEL, NULL, 1)) AS COND_ID VON table_1 t CONNECT BY ID_TRA = PRIOR ID_TRA UND STAND DER SYS_GUID() IS NOT NULL UND LEVEL

+0

Wenn Sie eine Sequenz wünschen, verwenden Sie einfach your_sequence.nextVal anstelle von ROWNUM in der externen Abfrage – Aleksej

0

Try this:

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;