本帖最后由 chengccy 于 2012-06-28 18:09:50 编辑

解决方案 »

  1.   

    没环境没调试,可以试试以下指令:
    大致思路:
    先换成这种形式
    张三 00 数学
    张三 01 语文
    张三 02 英语
    张三 04 Oracle
    再以人名分组,利用wm_concat()函数select sname,wm_concat(cname) from 
      (select a.name sname,b.id,b.name cname form tableA a left join tableB b on 
      a.elective like '%'||b.id||'%'
      )group by sname;
      

  2.   

    还没用过的函数wm_concat()~~~学习学习
      

  3.   

    用like的话,elective的ID超过10个就会出问题了
    如031014,应该是 03,10,14 like 一下就出问题了
      

  4.   

    看来一条SQL难哦,要不然就先把A表的elective处理了。
      

  5.   

    这下OK了,但是你的ID必须是两位长度喔...
    WITH t1 AS(
    SELECT 'zhang san' SNAME,'00010204' elective FROM dual
    UNION ALL 
    SELECT 'li si','010203' FROM dual
    ),t2 AS (
    SELECT 'elective' Value,'00' id,'shu xue' cname FROM dual 
    UNION ALL 
    SELECT 'elective','01','xu wen' FROM dual
    UNION ALL 
    SELECT 'elective','02','ying yu' FROM dual
    UNION ALL 
    SELECT 'elective','03','C yu yan' FROM dual
    UNION ALL 
    SELECT 'elective','04','Oracle' FROM dual
    UNION ALL 
    SELECT 'elective','10','JAVA' FROM dual
    )select sname,wm_concat(cname) from 
      (
      select a.sname,b.id,b.cname cname from t1 a left join t2 b on 
      a.elective like '%'||b.id||'%' AND Mod(InStr(a.elective,b.id)-1,2)=0 
      )group by sname;
      

  6.   

    oracle 提供了新的聚集函数 listagg()
      

  7.   

    直接用取串函数substr(),再用所取串跟B表id的相等后,联接取出B表的name字段不就好了。