create table NODE
(
  NODECODE   CHAR(8) not null,
  NODENAME   VARCHAR(100) not null,
  NODEWITH   CHAR(8) );
/*
NODE 是网点表:NODECODE网点编号,VARCHAR网点名,NODEWITH 属于那个网点
*/insert into node values( '00000000','总部',null);insert into node values(  '00000001','广东分公司','00000000');
insert into node values( '00000002','四川分分公司','00000000');insert into node values( '00000005','云南分分公司','00000000');
insert into node values( '00000003','广州办事处','00000001');
insert into node values( '00000004','成都办事处','00000002');
insert into node values( '00000006','昆明办事处','00000005');create table USERORDER
(
  NODECODE CHAR(8),
  USERCODE CHAR(8),
  DEALRATE INTEGER
);
/*
USERORDER 订单审核人表:NODECODE网点编号(与NODE表的NODECODE关联),USERCODE用户编号,DEALRATE 等级
*/
insert into USERORDER  values( '00000000','A1',1);
insert into USERORDER values( '00000001','B1',1);
insert into USERORDER values( '00000001','B2',2);
insert into USERORDER values( '00000002','C1',1);
insert into USERORDER values( '00000002','C2',2);
insert into USERORDER values( '00000003','D1',1);
insert into USERORDER values ('00000004','D2',1);
insert into USERORDER values( '00000006','F1',1);/*
我要的结果是订单审核的几种线路比如:广东分公司的订单是让   D1  B1 B2  A1  按顺序审(B1 B2同一级,B2等级数据高一点,所以B1在B2前)
      云南公公司在分公司时没有人,所以就只有总部与办事处审核     结果是: D1    B1    B2     A1
        D2    C2    C1     A1
        F1                 A1
*/drop table node;
drop table USERORDER;

解决方案 »

  1.   

    select node,nodecode,usercode,dealrate from 
    (select b.nodecode nodecode ,a.nodecode node , a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b 
    where a.nodecode = b.nodecode 
    and b.nodecode<>'00000000'
    and nodewith='00000000'
    union 
    select b.nodecode nodecode ,a.nodecode node ,a.usercode usercode ,a.dealrate dealrate  from USERORDER a ,node b 
    where  a.nodecode=b.nodewith 
    and b.nodecode<>'00000000'
    and nodewith='00000000'
    union 
    select  b.nodecode nodecode ,a.nodecode node ,a.usercode usercode ,a.dealrate dealrate  from USERORDER a ,node b 
    where a.nodecode=(select nodecode from node c where c.nodewith=b.nodecode )
    and b.nodecode<>'00000000'
    and nodewith='00000000')
    order by nodecode ,node desc ,dealrate
      

  2.   

    这个列数是不固定的吧。好多地方都不明白B1在B2前面,那为什么C1在C2后面呢
      

  3.   

    不好意思,是我写错了结果是: D1    B1    B2     A1
            D2    C1    C2     A1
            F1                 A1我要的结果大概意思就是,从总部到分公司有多少条审核线路,
    比如:总部是让 A1 一个人审,所以他是第一级
         广东分公司:    D1  B1 B2  A1                  因为D1(办事处)是最下面的所以它是第一个审核人:
                    (B1,B2)是同一级的,但B1等级(DEALRATE )小,所以他在B2前
                       A1是总部的,他是最后一个审核人
    我不知道现在说清楚没
      

  4.   

    我问下 你要是想审核总公司 是怎么走的!
    广东分公司的订单是让   D1  B1 B2  A1  按顺序审
      

  5.   

    只能用procedure来做吧不过,如果可以的话,最好是通过程序代码来做了。把两个表全取出来,内存整理结构,然后把结构cache住。
      

  6.   

    列不固定的话,就比较复杂了。以前写过一个类似的,但你这个比那个更复杂,先按我自己理解写了一个,可能不太对,lz试试吧create or replace package RefCursor is   
     type t_RefCursor is ref cursor;  
    end RefCursor;
    create or replace procedure test
    as
     v_cur RefCursor.t_RefCursor;
     v_count varchar2(8);
     v_level number;
     v_sql varchar2(4000);
     v_sql1 varchar2(4000);
     i number;
    begin
     v_sql:='create or replace view aaa as select '
     open v_cur for 'select b.level,count(1) 
                     from USERORDER a left join (select level,NODECODE from NODE connect by prior NODECODE=NODEWITH) b
                     on a.NODECODE=b.NODECODE group by b.level order by level desc';
     open v_cur;
     fetch v_cur into v_level,v_count;
     while v_cur %found loop
      for i in 1..v_count loop
       v_sql1:=v_sql1||' ,max(case when level='||v_level||' and DEALRATE='||v_count||' then USERCODE else null end) col_'||v_level||'_'||i;
       exit when i=v_count;
      end loop;
      fetch v_cur into v_level,v_count;
     end loop;
     close v_cur;
     v_sql1:=v_sql1||' from (select b.level,a.DEALRATE,a.USERCODE
                     from USERORDER a left join (select level,NODECODE from NODE connect by prior NODECODE=NODEWITH) b
                     on a.NODECODE=b.NODECODE) tab'
     execute immediate v_sql||substr(v_sql1,2);
    end;
    /select * from aaa;