这本是网友的一个问题。用了比较愚笨的方法解决的。抛砖引玉。
问题如下:
有两张表如下
表1是原始表,表2的内容是把上级和下级的全部对应起来,包括自己,
比如表1上级2对应的下级有30,20,然后30的下级又有300
在表2中就要写4条记录,分别为30,20,300,2这几个下级。
不知道大伙能听明白否
表1
上级 下级
1 20
2 30
3 10
2 20
30 300
表2
上级 下级
1 20
1 1
2 30
2 20
2 2
3 10
3 3
30 300
2 300
30 30
解决方法:
SQL
>
create
table
a(u
number
(
3
),l
number
(
3
))
2
;
Table
created
SQL
>
insert
into
a(u,l)
values
(
1
,
20
);
1
row inserted
SQL
>
insert
into
a(u,l)
values
(
2
,
30
);
1
row inserted
SQL
>
insert
into
a(u,l)
values
(
3
,
10
);
1
row inserted
SQL
>
insert
into
a(u,l)
values
(
2
,
20
);
1
row inserted
SQL
>
insert
into
a(u,l)
values
(
30
,
300
);
1
row inserted
SQL
>
commit
;
Commit
complete
1
,创建类型
create
or
replace
type r_type
is
object(u
number
,l
number
);
create
or
replace
type t_table
is
table
of
r_type;
2
,创建function
create
or
replace
function
getData
return
t_table
as
cursor
ca
is
select
distinct
u
from
a;
rs ca
%
rowtype;
cursor
cb(kk
number
)
is
select
*
from
a connect
by
prior l
=
u start
with
u
=
kk;
rr cb
%
rowtype;
rs2 t_table:
=
t_table();
liu
number
;
i
integer
;
begin
i:
=
1
;
open
ca;
loop
fetch
ca
into
rs;
exit
when
ca
%
notfound;
open
cb(rs.u);
loop
fetch
cb
into
rr;
exit
when
cb
%
notfound;
rs2.extend(
1
);
rs2(i):
=
r_type(rs.u,rr.l);
i:
=
i
+
1
;
end
loop;
rs2.extend(
1
);
rs2(i):
=
r_type(rs.u,rs.u);
i:
=
i
+
1
;
close
cb;
end
loop;
close
ca;
return
rs2;
end
;
3 ,查询验证
SQL
>
select
*
from
table
(getdata);
U L
--
-------- ----------
30
300
30
30
1
20
1
1
2
30
2
300
2
20
2
2
3
10
3
3
10
rows selected