2016-08-09 7 views
2

ある表から別の表に値を挿入したいが、最初の表の値はコンマで区切られた単一の文字列に格納されている。 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 

それは

+3

は決して、これまでにカンマ区切り値などのデータを格納しません。それはあなたに多くのトラブルを引き起こすだけです。 – jarlh

+0

値はそうだったので、私にこの機能を送ったとき –

+0

あなたはそれに対処しなければならない...あまりにも悪い。 – jarlh

答えて

1

を挿入されていますようidはあなたが挿入-選択この方法を使用することができます自動インクリメントする必要があります順序が重要である

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

select stamentにシーケンスを入れても機能しないのですか? ( SELECT ID_TRA、 FROM(ID、ID_TRA、COND_ID) SELECT MY_SQ.nextval、ID_TRA、COND_ID は 'REGEXP_SUBSTR(COND、から'「(([^、] *)(、トリムtable_2に挿入| $を) '1、LEVEL、NULL、1))COND_ID ASのtable_1のT CONNECT FROM ID_TRA = PRIOR ID_TRA AND PRIOR SYS_GUID(BY)NULL AND LEVEL

+0

シーケンスが必要な場合は、外部クエリでROWNUMの代わりにyour_sequence.nextValを使用するだけです – 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; 
関連する問題