怎样把多行查询结果集,在一个字段里显示.

解决方案 »

  1.   

    字段类型要匹配写个过程;
    create or replace procedure p_test
    as
    v_rowline table%rowtype
    cursor cur is select field1,field2,... from table 
    begin
      open cur
      loop
        fetch cur into v_rowline
        when exit cur%notfound;
        execute immediate 'create table t1(field1,field_type)';
        execute immediate 'insert into t1 values(v_rowline.field1)';
        execute immediate 'insert into t1 values(v_rowline.field2)'
        execute immediate 'insert into t1 values(v_rowline.field3)'
        ...
      end loop;
      execute immediate 'select field1 from t1';
      close cur;
    end没测试不知道能不能行.
        
      

  2.   

    SQL> select table_name from t;TABLE_NAME
    ------------------------------
    AA
    T_TEST
    T
    TEST
    MIKE_TEST0115SQL> select max(sys_connect_by_path(table_name,',')) from
      2  (
      3  select table_name, rn,
      4  lead(rn) over(order by rn) rn1
      5  from
      6  ( select table_name,rownum rn from t ))
      7  start with rn=1
      8  connect by prior rn1=rn
      9  /MAX(SYS_CONNECT_BY_PATH(TABLE_
    --------------------------------------------------------------------------------
    ,AA,T_TEST,T,TEST,MIKE_TEST0115
      

  3.   

    方法有很多种,关键是要自己知道思路.sys_connect_by_path是一个不错的选择,另外还可以用lag/lead结合字符串连接符'||'实现...
      

  4.   

    我这儿有一个SQL2000的例子,你将它改成Oracle就行了,可以在SQL2000里面直接执行.
    CREATE TABLE TEL
    (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    NAME VARCHAR(8) NULL,
    TEL VARCHAR(8) NULL,
    )
    GO
    INSERT INTO TEL
    SELECT 'W','1' UNION
    SELECT 'W','2'UNION
    SELECT 'W','3'UNION
    SELECT 'X','4'UNION
    SELECT 'X','5'UNION
    SELECT 'X','6'UNION
    SELECT 'Y','7'UNION
    SELECT 'Y','8'UNION
    SELECT '衣服','春装'UNION
    SELECT '衣服','冬装'UNION
    SELECT 'COLOR','RED' UNION
    SELECT 'COLOR','YELLOW' UNION
    SELECT 'COLOR','BLACK' UNION
    SELECT 'COLOR','GREEN' UNION
    SELECT 'COLOR','BLACK' UNION
    SELECT 'COLOR','CYAN'  
    GO
    CREATE TABLE TELNAME
    (
    NAME VARCHAR(8)  PRIMARY KEY,
    TEL VARCHAR(8000) NULL,
    )
    GO
    INSERT INTO TELNAME 
    (NAME)
    SELECT NAME FROM TEL GROUP BY NAME 
    GO
    CREATE FUNCTION V_TEL
    (
    @TNAME VARCHAR(8)  
    )
    RETURNS  VARCHAR(8000)
    BEGIN
    DECLARE @MESSAGE VARCHAR(8000)
    DECLARE CURTEL CURSOR
    READ_ONLY
    FOR SELECT TEL FROM TEL WHERE [NAME]=@TNAME
    SET @MESSAGE=''
    DECLARE @NAME VARCHAR(40)
    OPEN CURTEL
    FETCH NEXT FROM CURTEL INTO @NAME
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    IF (@@FETCH_STATUS <> -2)
    BEGIN
    SET @MESSAGE=@MESSAGE + @NAME+','
    END
    FETCH NEXT FROM CURTEL INTO @NAME
    END
    CLOSE CURTEL
    DEALLOCATE CURTEL
    RETURN (LEFT(@MESSAGE,LEN(@MESSAGE)-1))
    END 
    GOUPDATE TELNAME
    SET TEL=(SELECT DBO.V_TEL([NAME]) )
    GO
    SELECT * FROM TEL
    SELECT * FROM TELNAMEDROP TABLE TEL 
    DROP TABLE TELNAME 
    DROP FUNCTION V_TEL
      

  5.   

    前:
    1 COLOR BLACK
    2 COLOR CYAN
    3 COLOR GREEN
    4 COLOR RED
    5 COLOR YELLOW
    6 W 1
    7 W 2
    8 W 3
    9 X 4
    10 X 5
    11 X 6
    12 Y 7
    13 Y 8
    14 衣服 春装
    15 衣服 冬装
    运行结果:
    COLOR BLACK,CYAN,GREEN,RED,YELLOW
    W 1,2,3
    X 4,5,6
    Y 7,8
    衣服 春装,冬装
    不知道是不是这个样子的.
      

  6.   

    --将一个表里的某个字段的所有记录连接起来,返回一个字符串:
    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;
    /*
    SQL> select * from henry_test;A                                                B
    ---------- ---------------------------------------
    aa                                               1
    bb                                               1
    cc                                               1
    dd                                               2
    ee                                               2
    ff                                               3
    gg                                               3
    hh                                               38 rows selected
    */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,
    */
    Drop Table henry_test;/*
    上面的操作仅限于一张表内。
    */
      

  7.   

    另外应用sys_connect_by_path也可以不过有个问题,那就是返回的值的标点符号在第一位,你弄出结果后做下处理就行啦!