不是必须要用一条SQL实现。用PLSQL实现也可以。table1(id varchar2(10), name varchar2(10))id  name
1   aa
1   bb
1   cc
2   xx
3   yy
3   zz
...想得到一个结果集如下:
id  names
1   aa+bb+cc
2   xx
3   yy+zz
...请教了。

解决方案 »

  1.   

    可能要先定义一个记录集的type,
    create or replace type t_name as object
    (
             Id              number(10),    
             Name varchar2(20),
    );
    create or replace type t_tab_names as table
    of t_name;create or replace procedure p_test (p_tTab_names out t_tab_names) as
      i number;
      flag number;
      vtemp varchar2(100);
      tname t_name;
    begin 
      i:=0;
      p_tTab_names:=new t_tab_names();
      for v in (select id from table1 group by id) loop
         i:=i+1;
         flag:=0;
         for vv in (select id,name from table1 where id=v.id) loop
           if (flag=0) then 
             vtemp:=vv.name;
           else
             vtemp:=vtemp||'+'||vv.name;
           end if;
           flag:=1;
         end loop;
         
         tname.id:=v.id;
         tname.name:=vtemp;
         p_tTab_names.extend;
         p_tTab_names(i):=tname;
      end loop;
      
      exception when others then 
        dbms_output.put_line(sqlerrm);end p_test;
      

  2.   

    谢谢kinglht(爱新觉罗至尊宝)...还有这样一个问题,目前的代码返回的是一个数组,我现在想把结果集以一个游标的形式返回?那么,用游标,该如何返回呢?
      

  3.   


    select distinct yy.id,
           ltrim(first_value(yy.path) over(partition by yy.id order by yy.lev desc),'+') as name
      from (        
              select zz.*,
                     sys_connect_by_path(zz.name,'+') as path,
                     level lev
                from (
                        select tt.*,
                               tt.id || row_number() over(partition by tt.id order by tt.id)-1 as frontrn,
                               tt.id || row_number() over(partition by tt.id order by tt.id) as afterrn
                          from table1 tt
                     )zz
               connect by prior zz.frontrn = zz.afterrn
             )yy;        ID NAME
    ---------- --------------------------------------------
             1 cc+bb+aa
             2 xx
             3 zz+yy
      

  4.   

    SQL> select * from a;I NAM
    - ---
    1 aa
    1 bb
    1 cc
    2 xx
    2 yy
    3 zz
    3 mm已选择7行。SQL>  select max(substr((sys_connect_by_path(name,',')),2)) col
      2   from (
      3   select id,name,
      4          id+row_number() over( order by id) rn,
      5          row_number() over(partition by id order by id) rn1
      6   from a
      7   )
      8   start with rn1=1
      9   connect by rn-1=prior rn
     10   group by id
     11  ;COL
    --------------------------------------------------------------------------------aa,bb,cc
    xx,yy
    zz,mm
      

  5.   

    上一个麻烦了,用rownum更简单些 select max(substr((sys_connect_by_path(name,',')),2)) cola
     from (
     select id,name,
            rownum rnum,
            row_number() over(partition by id order by id) rn1
     from a
     )
     start with rn1=1
     connect by rnum-1=prior rnum
     group by id
    ;