第一张表是这样的zb_Code 
zb_Id------zb_Name 
--01----------aa 
--02----------bb 
--03----------cc 
第二张表 zb_Data 
data_Id------data_Name 
--01----------01,02,03 
--02----------02,03 
--03----------01,03 结果要是这个样子: 
--1----------01,02,03------aa,bb,cc 
--2----------02,03------bb,cc 
--3----------01,03------aa,cc 
第二张表的data_Name是第一张表的zb_Id集合
写个函数

解决方案 »

  1.   

    给出函数:
    CREATE OR REPLACE FUNCTION fun_analyze(prm_id IN VARCHAR2) RETURN VARCHAR2 IS
      TYPE t_tid IS TABLE OF VARCHAR2(200) INDEX BY PLS_INTEGER;
      TYPE t_name IS TABLE OF VARCHAR2(200) INDEX BY PLS_INTEGER;  arr_id   t_tid;
      arr_name t_name;
      v_tempid VARCHAR2(20);
      v_temp   VARCHAR2(20);
      n_number INTEGER := 0;
      v_name   VARCHAR2(200);
    BEGIN
      FOR i IN 1 .. length(prm_id || ',') LOOP
        v_temp := substr(prm_id || ',', i, 1);
      
        IF v_temp != ',' THEN
          v_tempid := v_tempid || v_temp;
        ELSE
          n_number := n_number + 1;
          arr_id(n_number) := v_tempid;
          v_tempid := '';
        
        END IF;
      
      END LOOP;  FOR j IN 1 .. arr_id.COUNT LOOP
        SELECT zb_name INTO arr_name(j) FROM zb_code WHERE zb_id = arr_id(j);
        v_name := v_name || ',' || arr_name(j);
      END LOOP;  RETURN substr(v_name, 2);
    END fun_analyze;
    然后执行:
    SELECT ROWNUM,data_name,fun_analyze(data_name) FROM zb_data;
    得到想要的结果!
      

  2.   

     函数中使用wm_concat 
     以"," 连接两列!
      

  3.   

    CREATE TABLE t1(id VARCHAR(10),name VARCHAR(10))
    ;
    INSERT INTO t1 VALUES('01','aa')
    ;
    INSERT INTO t1 VALUES('02','bb')
    ;
    INSERT INTO t1 VALUES('03','cc')
    ;
    CREATE TABLE t2(id VARCHAR(10),d VARCHAR(100))
    ;
    INSERT INTO t2 VALUES('01','01,02,03')
    ;
    INSERT INTO t2 VALUES('02','02,03')
    ;
    INSERT INTO t2 VALUES('03','03')
    ;SELECT a.id,a.d,wm_concat(b.name) x
           FROM t2 a
    INNER JOIN t1 b
          ON INSTR(','||a.d||',',','||b.id||',')>0
          GROUP BY a.id,a.d
     ; /*
    id    d        x 
    01 01,02,03 aa,bb,cc
    02 02,03 bb,cc
    03 03 cc
     */
      

  4.   

    with t1 as(
         select '01' zb_id,'aa' zb_name from dual
         union all
         select '02' zb_id,'bb' zb_name from dual
         union all
         select '03' zb_id,'cc' zb_name from dual          
    ),
    t2 as(
         select '01' data_id,'01,02,03' data_name from dual
         union all
         select '02' data_id,'02,03' data_name from dual
         union all
         select '03' data_id,'01,03' data_name from dual          
    )
    select data_name,wm_concat(zb_name) wm from
    (
    select t1.zb_id,t2.data_name,t1.zb_name from t1,t2 where INSTR(','||data_name||',',','||zb_id||',')>0
     group by t1.zb_id,data_name,zb_name order by t1.zb_id

    group by data_name