现在有一张部门关系表com_info,其中字段为com_code,up_com_code。就是存放部门以及其直属上级部门关系。比如有这么几条记录:
com_code     up_com_code    
860101        8601           
8601          86             
86现在我想每个部门与其所有上级部门都建立对应关系,存入到另外一张同构表com_info_rela中,本表中增加direct_flag字段,0表示间接关系,1表示直接关系,2表示本身。希望最后的得到的结果为:
com_code     up_com_code    direct_flag
860101        860101          2
860101        8601            1
860101          86            0
8601          8601            2
8601          86              1
86            86              2我目前是分三步走,
1。首先将所有部门与其直属上级对应关系导入到com_info_rela中。
2。然后用connect by这个递归语句将其间接关系插入。
3。最后再将其与本身的对应关系插入。
注:第3步必须在第2步之后,否则第2步报错。
我现在希望能通过一条select语句来实现转换,请问能否实现?谢谢!

解决方案 »

  1.   

    就你目前的这个编码方法来说(级别关系是2位数)
    UPDATE tt SET direct_flag=decode(length(com_code)-length(up_com_code),0,2,2,1,0);
      

  2.   

    没测试,试一下
    select com_code,up_com_code,num1+2*num2 direct_flag 
    (select a.com_code com_code,b.com_code up_com_code,
    (select count(*) from com_info where com_code=a.com_code and up_com_code=b.com_code) num1,
    (select count(*) from com_info where com_code=a.com_code and up_com_code=com_code) num2
    from com_info a,com_info b
    where a.com_code in (select com_code from com_info connect by com_code=up_com_code start whith up_com_code=b.com_code)
    or a.com_code=b.com_code)
      

  3.   


     就你目前的这个编码方法来说(级别关系是2位数)
    SELECT * FROM tt;
    860101 860101
    860101 8601
    860101 86
    8601 8601
    8601 86
    86 86
    --创建你要的新表tttt
    CREATE TABLE tttt AS
     SELECT com_code,up_com_code,decode(length(com_code)-length(up_com_code),0,2,2,1,0)
      direct_flag FROM tt;
      
    SELECT * FROM tttt;
    860101 860101 2
    860101 8601 1
    860101 86 0
    8601 8601 2
    8601 86 1
    86 86 2
      

  4.   

    SQL> with
      2  table_temp as(
      3    select com_code,level j
      4    from   com_info
      5    start with up_com_code is null
      6    connect by up_com_code = prior com_code)
      7  select
      8   t1.com_code com_code,
      9   t2.com_code up_com_code,
     10   t2.j-t1.j+2 direct_flag
     11  from table_temp t1
     12  join table_temp t2
     13  on (t1.j>=t2.j);COM_CODE UP_COM_CODE DIRECT_FLAG
    -------- ----------- -----------
      860101      860101           2
      860101        8601           1
      860101          86           0
        8601        8601           2
        8601          86           1
          86          86           26 rows selectedSQL> 
      

  5.   

    xinze2001 太厉害了,这就是我要的结果。