我的数据库是oracle9i,要实现如下功能:
原表tb结构及数据如下:
pk    id                 name             father_pk
01   01                 总公司            null
02   0101             一级分公司A          01
03   0102             一级分公司B          01
04   010101         二级分公司A1           02
05   010102         二级分公司A2           02
06   010201        二级分公司B1            03
07   010202        二级分公司B2            03...................................
总共有关4级分公司,我想要得到如下的结果pk   id1   name1    id2       name2           id3         name3                 id4           name4
02   01   总公司    0101     一级分公司A     0101      一级分公司A             0101         一级分公司A
03   01   总公司    0102     一级分公司B     0102      一级分公司B             0102         一级分公司B
04   01   总公司    0101     一级分公司A     010101    二级分公司A1            010101        二级分公司A1
05   01   总公司    0101     一级分公司A     010102    二级分公司A2            010101        二级分公司A2

将树型结构的数据展平,父子关系是用pk和father_pk来进行关联,在一行记录中显示它的所有级次,高手指教

解决方案 »

  1.   

    with tt as(select '01' pk,'01' id ,'总公司' name,null father_pk from dual
      union all select '02','0101','一级分公司A','01' from dual
      union all select '03','0102','一级分公司B','01' from dual
      union all select '04','010101','二级分公司A1','02' from dual
      union all select '05','010102','二级分公司A2','02' from dual
      union all select '06','010201','二级分公司B1','01' from dual
      union all select '07','01010101','三级分公司A1(1)','04' from dual
      )--union all select '08','0101010101','四级分公司A1(1).1','07' from dual
      
    select nvl(nvl(d.pk,c.pk),b.pk)pk,
      a.id id1,a.name name1,
      b.id id2,b.name name2,
      c.id id3,c.name name3,
      d.id id4,d.name name4 
    from 
      tt a join tt b on a.pk=b.father_pk --or a.pk=b.pk
        left join tt c on b.pk=c.father_pk or b.pk=c.pk
        left join tt d on c.pk=d.father_pk or c.pk=d.pkPK ID1 NAME1 ID2 NAME2 ID3 NAME3 ID4 NAME4
    02 01 总公司 0101 一级分公司A 0101 一级分公司A 0101 一级分公司A
    04 01 总公司 0101 一级分公司A 0101 一级分公司A 010101 二级分公司A1
    05 01 总公司 0101 一级分公司A 0101 一级分公司A 010102 二级分公司A2
    04 01 总公司 0101 一级分公司A 010101 二级分公司A1 010101 二级分公司A1
    07 01 总公司 0101 一级分公司A 010101 二级分公司A1 01010101 三级分公司A1(1)
    05 01 总公司 0101 一级分公司A 010102 二级分公司A2 010102 二级分公司A2
    03 01 总公司 0102 一级分公司B 0102 一级分公司B 0102 一级分公司B
    04 0101 一级分公司A 010101 二级分公司A1 010101 二级分公司A1 010101 二级分公司A1
    07 0101 一级分公司A 010101 二级分公司A1 010101 二级分公司A1 01010101 三级分公司A1(1)
    07 0101 一级分公司A 010101 二级分公司A1 01010101 三级分公司A1(1) 01010101 三级分公司A1(1)
    05 0101 一级分公司A 010102 二级分公司A2 010102 二级分公司A2 010102 二级分公司A2
    06 01 总公司 010201 二级分公司B1 010201 二级分公司B1 010201 二级分公司B1
    07 010101 二级分公司A1 01010101 三级分公司A1(1) 01010101 三级分公司A1(1) 01010101 三级分公司A1(1)