请问如何将一个表中的不同记录合并到一个记录中??? 如我现在的表结构Test为 
ID DATA 
1 A 
1 B 
2 C 
2 D 
2 E 
2 F 希望将其转换Test2为 
ID DATA 
1 A,B 
2 C,D,E,F

解决方案 »

  1.   

    create or replace procedure proc_test_test2
     (v_c1 in varchar2,
      v_result out varchar2)
     as
     cursor cur_ is
     select data from table1
     where id=v_c1;
     begin
     for v_c2 in cur_ loop
     v_result := v_result||','||v_c2.data;
     end loop;
     end;这个试试
      

  2.   

    select b.id,
           (select ltrim(max(sys_connect_by_path(a.data, ',')),',') data
              from (select a.id,
                           a.data,
                           a.n,
                           lead(a.n) over(partition by a.id order by a.n) n1
                      from (select a.id,
                                   a.data,
                                   row_number() over(order by a.id, a.data desc) n
                              from test a) a) a
             start with a.id = b.id
                    and a.n1 is null
            connect by n1 = prior a.n) v1
      from (select distinct a.id from test a) b
      

  3.   

    Create Table henry_test (a varchar2(10),b int);
    Insert Into henry_test values ('aa',1);
    Insert Into henry_test values ('bb',1);
    Insert Into henry_test values ('cc',1);
    Insert Into henry_test values ('dd',2);
    Insert Into henry_test values ('ee',2);
    Insert Into henry_test values ('ff',3);
    Insert Into henry_test values ('gg',3);
    Insert Into henry_test values ('hh',3);
    Commit; 
    create or replace function f_henry_ConcatRowsByColumn(
    Column2Value in Varchar2,  --分组该列的值
    ColumnName1 in Varchar2,  --要连接的列名
    ColumnName2 in Varchar2,  --用来做分组依据的列名
    TableName  in Varchar2  --表名

      return varchar2 is
      v_Result varchar2(32767);
      type cur_type is ref cursor;
      myCur cur_type;
      v_Column1Value varchar2(4000);
    begin
      Open myCur for 'Select '||ColumnName1||' From '||TableName||' Where '||ColumnName2||' = '||Column2Value;
      Loop
        Fetch myCur Into v_Column1Value;
        Exit When myCur%notfound;
        v_Result:=v_Result||v_Column1Value||',';
      End Loop;
      Close myCur;
      return(v_Result);
    end f_henry_ConcatRowsByColumn; 
    /*
    SQL> select B,f_henry_ConcatRowsByColumn(B,'A','B','henry_test') from henry_test group by B;                                       B F_HENRY_CONCATROWSBYCOLUMN(B,'
    --------------------------------------- --------------------------------------------------
                                          1 aa,bb,cc,
                                          2 dd,ee,
                                          3 ff,gg,hh,
    */ 
      

  4.   

    zealot_001() 
    没想到,不用存储过程或自定义函数也能实现,不过看上去是够复杂的,谢谢哈。
    不过,问题来了,使用存储过程或自定义函数如你所写,那个效率高呢,决定因素是什么呢?