递归选择函数

时间:2017-12-25 22:03:46

标签: sql oracle recursion

我正在尝试创建递归查询但没有结果。下面我介绍了我的问题。 输入数据:

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;

我只想在某些功能中打包代码。

1 个答案:

答案 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