某表若干记录
ID--------type
1---------a,b,c,s,fas,dasd,asd
2---------a,b,c,s,fas
11--------sd,asdtype 里面有可能只有1个或任意多个属性且由逗号隔开,我想把数据变成如下形式:
ID--------type
1---------a
1---------b
1---------c
1---------s
1---------fas
1---------dasd
1---------asd
2---------a
2---------b
2---------c
2---------s
2---------fas
11--------sd
11--------asd
这张表近600万的记录,求最快捷的方法,最好也考虑到迁移。

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE pro_split IS
    --从t(id,type1)插入备份表t_bak(id,type1)
    --数据量大,可按条件每次做一部分
    BEGIN
      FOR c IN (SELECT id,type1 FROM t) LOOP
        INSERT INTO t_bak
          (id, TYPE1)
          SELECT c.id, TYPE1
            FROM (WITH t AS (SELECT c.TYPE1 str FROM dual)
                   SELECT substr(str,
                                 instr(str, ',', 1, LEVEL) + 1,
                                 instr(str, ',', 1, LEVEL + 1) -
                                 instr(str, ',', 1, LEVEL) - 1) TYPE1
                     FROM (SELECT ',' || str || ',' str FROM t)
                   CONNECT BY LEVEL < length(str) - length(REPLACE(str, ','));
      
        );
      END LOOP;
    END;
    /