一条记录里有F1,F2,F3三个属性相同的字段,拆分为3条记录!例如: F1,F2,F3
       a   b  c
       d   e  f
结果:
       a
       b 
       c
       d
       e
       f要求:用一条Select 语句,不用union 不用存储过程,做好能给一个ORACLE 的函数。越简洁越好!  在线等待,解决马上送分!

解决方案 »

  1.   

    select * from table A, table B where rownum<2
    呵呵,迪卡尔乘积,少数据还行,多了就不要这样了
      

  2.   

    Sorry,理解错误
    不用union 不用存储过程不好实现吧
      

  3.   

    --建立字段名名
    create table colName as
    select column_name           
     from User_Tab_Columns t where table_name = '表'  ;
    --建立结果表
    create table resultTable
    as
    select f1 as f from 原表.declare
      sqlstr varchar2(500);
      v_FN   ttt.column_name%type; 
      cursor c_F is
        select  column_name from ttt 
    begin
      sqlstr := ''; 
      open c_F;
      loop
      fetch c_F
        into v_FN, v_type;
      exit when C_F%notfound;
            
            sqlstr :=  'insert into resultTable select  ' || v_FN || ' as f from 原表';      
             -- dbms_output.put_line(sqlstr);
            EXECUTE IMMEDIATE sqlstr;   
    --  exit when C_F%notfound;
    end loop;
        close C_F;
    end;--结果
    select * from resultTable;
      

  4.   

    用表函数
    create or replace type rec_rowret AS OBJECT ( --RECORD
    R VARCHAR2
    )
    /
    CREATE OR REPLACE TYPE t_rec_rowret IS TABLE OF rec_rowgen
    /CREATE OR REPLACE FUNCTION UF_RowsRet(
    ps_f1 VARCHAR2,
    ps_f2 VARCHAR2,
    ps_f3 VARCHAR2
    ) RETURN t_rec_rowret PIPELINED PARALLEL_ENABLE IS
    ret_rec rec_rowret ;
    BEGIN
    ret_rec := rec_rowgen(NULL); ret_rec.r := ps_f1; PIPE ROW( ret_rec );
    ret_rec.r := ps_f2; PIPE ROW( ret_rec );
    ret_rec.r := ps_f3; PIPE ROW( ret_rec );
    END;
    /select r.r from t, UF_RowsRet(F1,F2,F3) r如果仅是这样,反而觉得有点复杂
      

  5.   

    更正:
    CREATE OR REPLACE TYPE t_rec_rowret IS TABLE OF rec_rowret
    /