我的数据库是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来进行关联,在一行记录中显示它的所有级次,高手指教
原表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来进行关联,在一行记录中显示它的所有级次,高手指教
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)