A表:
员工      科室          登记日期
张三  胸外科,皮肤科    2000-11-19
李四  胸外科           2001-01-04
王五  妇产科,骨科     2001-01-08
求一条sql,让其结果如下显示
A表:
员工      科室          登记日期
张三  胸外科           2000-11-19
张三  皮肤科           2000-11-19
李四  胸外科           2001-01-04
王五  妇产科           2001-01-08
王五  骨科             2001-01-08即A表员工属于多个科室的是在一行上用逗号分隔的,现在要把这种形式换成用增加行的形式来解决,属于多个科室就有多行记录

解决方案 »

  1.   

    一句SQL解决不了,需要写存储过程,用游标来逐行分解。
      

  2.   


    with t1 as
    (
    select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3  from dual 
    union all
    select '李四','胸外科',date'2001-01-04'  from dual 
    union all
    select '王五','妇产科,骨科',date'2001-01-08' from dual
    )select c1,
      substr(','||c2||',',instr(','||c2,',',1,b.rn)+1,
      instr(c2||',',',',1,b.rn)-instr(','||c2,',',1,b.rn)) c2,c3
    from t1,
      (select rownum rn from t1
      connect by rownum<10) b
      where length(c2)-length(replace(c2,','))+1>=b.rn
    order by c1,b.rn      c1     c2    c3
    -----------------------------------------------
    1 李四 胸外科 2001/1/4
    2 王五 妇产科 2001/1/8
    3 王五 骨科 2001/1/8
    4 张三 胸外科 2000/11/19
    5 张三 皮肤科 2000/11/19
      

  3.   

    借上面的数据用一下
    with t1 as
    (
    select '张三' c1,'胸外科,皮肤科,骨科1,骨科2,骨科3,骨科4,骨科5,骨科6,骨科7,骨科8,骨科9,骨科10,骨科11,骨科12,骨科13,骨科14,骨科15,骨科16,骨科17' c2,date'2000-11-19' c3  from dual 
    union all
    select '李四','胸外科',date'2001-01-04'  from dual 
    union all
    select '王五','妇产科,骨科',date'2001-01-08' from dual
    )
    select DISTINCT c1
           ,c3
           ,REPLACE( -- 去除多余的【,】
                regexp_substr(c2||',' ,'.*?'||'[,]' ,1 ,LEVEL)  -- 截取 ,【科室】,
                ,',') "科室"
    from t1
            connect by level <= nvl(
                                   length(regexp_replace(c2,'[^,]','')) + 1
                                  ,1)
    order by c1;
      

  4.   

    with t1 as
    (
    select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3  from dual 
    union all
    select '李四','胸外科',date'2001-01-04'  from dual 
    union all
    select '王五','妇产科,骨科',date'2001-01-08' from dual
    )select c1,
      substr(','||c2||',',instr(','||c2,',',1,b.rn)+1,
      instr(c2||',',',',1,b.rn)-instr(','||c2,',',1,b.rn)) c2,c3
    from t1,
      (select rownum rn from t1
      connect by rownum<10) b
      where length(c2)-length(replace(c2,','))+1>=b.rn
    order by c1,b.rn         c1     c2    c3
    -----------------------------------------------
    1    李四    胸外科    2001/1/4
    2    王五    妇产科    2001/1/8
    3    王五    骨科    2001/1/8
    4    张三    胸外科    2000/11/19
    5    张三    皮肤科    2000/11/19
      

  5.   

    2楼3楼正解。 字符串转列1.substr + instr,2.regexp_substr