本帖最后由 answer0706 于 2011-09-08 14:47:09 编辑

解决方案 »

  1.   

    你的COURSE表设计的也太N了吧,自己给自己出难题的不是?
      

  2.   

    oracle11.2
    select c.cid,listagg(s.sname) within group (order by c.cid) as snames from course c , student s where instr(c.sidstr,s.sid)>0 group by c.cid
      

  3.   

    其他select vs.cid, ltrim(max(sys_connect_by_path(vs.sname, ',')), ',')
      from (select s.sname,
                   c.cid,
                   row_number() over(partition by c.sidstr order by s.sid) as rn
              from course c, student s
             where instr(c.sidstr, s.sid) > 0) vs
     start with vs.rn = 1
    connect by prior vs.rn = vs.rn - 1
           and prior vs.cid = vs.cid
     group by vs.cid
     order by vs.cid
      

  4.   

    select a.cid,wm_concat(b.sname)
    from 
    (SELECT cid,REGEXP_SUBSTR(sidStr,'[^,]+',1,l) AS sid
      FROM course
          ,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100)
    WHERE l <=LENGTH(sidStr) - LENGTH(REPLACE(sidStr,','))+1
    ORDER BY 1,2) a left join student b
    on a.sid=b.sid
    group by a.cid
      

  5.   

    声明一点,这只是个和编写SQL语句有关的问题,注重的是SQL编写能力。
      

  6.   

    如果是10g及以上版本: SELECT C.CID, WM_CONCAT(S.SNAME)
       FROM COURSE C, STUDENT S
      WHERE INSTR(C.SIDSTR, S.SID) > 0
      GROUP BY C.CID10g以下版本,4楼的比较好吧
      

  7.   

    WM_CONCAT  是什么函数?
      

  8.   


    with course as(
    select '1' cid,'1,2,3,4' sidStr from dual union
    select '2','1,2,3' from dual),
    student as(
    select '1' sid,'学生1' sname from dual union
    select '2','学生2' from dual union
    select '3','学生3' from dual union
    select '4','学生4' from dual)select distinct wm_concat(sname) over(partition by sidstr)
      from course,student
     where instr(','||course.sidstr||',',','||student.sid||',') > 0
      

  9.   

    编写sql语句的能力,是体现在正确的逻辑上的,你这逻辑上都不对,还写啥。
      

  10.   

    逻辑上没有不正确的,特殊场景上有可能会出现这种情况。问题是很NB的设定不能通过存储过程只能用sql
      

  11.   

    遇到过这样的问题,用我的描述就是:本来是竖着的东西,非得横着看。哈哈,果断的放弃了用SQL实现如此纠结的问题。随便一种编程语言都可以搞定之。好吧,我承认,我只会C。1.游标
    2.for循环搞定之。