我正在尝试创建递归查询但没有结果。下面我介绍了我的问题。 输入数据:
CREATE TABLE NAME (ID varchar2(100), NAME varchar2(100));
CREATE TABLE REL (ID varchar2(100), PARENT varchar2(100),
CHILD varchar2(100), TYPEREL VARCHAR2(100));
INSERT INTO NAME (ID, NAME) VALUES ('2123', 'AD1');
INSERT INTO NAME (ID, NAME) VALUES ('3133', 'AD2');
INSERT INTO NAME (ID, NAME) VALUES ('34535', 'AD3');
INSERT INTO NAME (ID, NAME) VALUES ('42345', 'AD4');
INSERT INTO NAME (ID, NAME) VALUES ('3422', 'AD5');
INSERT INTO NAME (ID, NAME) VALUES ('3414', 'AD6');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('313', '2123', '3133', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('422', '3422', '34535', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('233', '3414', '2123', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('111', '3422', '2123', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('341', '42345', '3422', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('464', '3422', '2123', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('908', '42345', '3133', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('625', '34535', '3414', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('783', '3414', '3133', 'X');
INSERT INTO REL (ID, PARENT, CHILD, TYPEREL) VALUES ('377', '3133', '34535', 'X');
如果出现,我想创建关系的函数返回循环。 (例如(2121,3133,34535,3413,2121))。
我正在尝试这个:
create or replace function aaa return ??? as
???
x varchar2(10);
z varchar2(10);
begin
with xxx as(select distinct x1.parent, x1.child as child1
from rel x1 where x1.parent = x1.child)
select count(*) into x from xxx;
while(x = 0 || z=100) {
select *from xxx
inner join rel on child1 = xxx.parent ;
z := z+1;
}
return ???;
end;
/
当然功能aaa编译不正确。首先,我不知道如何从这个函数返回循环。 (作为行?但我不知道需要多少列)。另一个问题是上面代码中while循环中的child1。如何在循环中加入最后一个孩子(这里是child1)?可以在此while循环中从rel表中选择所有列xxx和仅子列吗?我的方法可以吗?任何提示我可以做些什么来达到想要的结果?
还有一个信息。就我而言,第一个周期出现在此之后:
select distinct x1.parent, x1.child , x2.child , x3.child--, x4.child
from rel x1
inner join rel x2 on x1.child = x2.parent
inner join rel x3 on x2.child = x3.parent
--inner join rel x4 on x3.child = x4.parent
where x1.parent = x1.child or x1.parent = x2.child
or x1.parent = x3.child; --or x1.parent = x4.child;
我只想在某些功能中打包代码。
答案 0 :(得分:0)
在你的一条评论中写道:
在表格" rel"一个孩子"可以有更多的父母"和副 反之亦然。
也许以下查询会给你一个起点。
-- test data (from your question)
SQL> select * from rel;
ID PARENT CHILD TYPEREL
313 2123 3133 X
422 3422 34535 X
233 3414 2123 X
111 3422 2123 X
341 42345 3422 X
464 3422 2123 X
908 42345 3133 X
625 34535 3414 X
783 3414 3133 X
377 3133 34535 X
查询/结果:
SQL> select
2 parent
3 , listagg( child, ',' ) within group ( order by child ) children
4 from rel
5 group by parent ;
PARENT CHILDREN
2123 3133
3133 34535
3414 2123,3133
3422 2123,2123,34535
34535 3414
42345 3133,3422