2

我是 PL SQL 的新手,我试图在它上面创建一个递归函数,但我对 PL SQL 术语太困惑了。

我有一个表结构,如:

    FFAM_ACC_ID     FFAM_UPPER_ACC_ID   FFAM_GROUP_FLAG
        1                   0                   1
        2                   1                   1
        3                   1                   2
        4                   2                   1
        5                   4                   2
        6                   1                   2
        7                   6                   2
        8                   0                   1
        9                   8                   2

现在,我想创建一个递归函数。所以,如果我提供一个FFAM_ACC_ID,它应该能够返回我有FFAM_GROUP_FLAG2 的孩子 ID。

FFAM_UPPER_ACC_ID是父 id 并FFAM_GROUP_FLAG确定该行是否是一个组。

所以,如果我提供 2,它应该什么都不返回,因为虽然它有一个子行,但 4。该行有FFAM_GROUP_FLAG1。即。它是组。

如果我提供 1,它应该返回3、6、7。这需要递归,因为 3 的父 id 为 1,而 7 的父 id 为 6。

如果我提供 9,它应该返回 9。虽然它没有子行,但它不是一个组。

SQL小提琴

4

2 回答 2

4

您实际上不需要递归过程,甚至根本不需要过程:改用分层查询

这应该可以满足您的要求(至少适用于您提供的输入):

select * from FMS_FC_ACC_MST
where ffam_group_flag = 2
start with ffam_acc_id = <your input>
connect by ffam_group_flag = 2 
       and prior ffam_acc_id = ffam_upper_acc_id;
于 2013-03-04T07:13:31.167 回答
1
with 
  input as (
     select 9 as FFAM_ACC_ID from dual  -- change to 1, 2
  )

select FFAM_ACC_ID
from FMS_FC_ACC_MST
start with 
   FFAM_UPPER_ACC_ID = (select FFAM_ACC_ID from input)
   and FFAM_GROUP_FLAG = 2
connect by 
   prior FFAM_ACC_ID = FFAM_UPPER_ACC_ID

union all

select FFAM_ACC_ID
from FMS_FC_ACC_MST
natural join input 
where FFAM_GROUP_FLAG = 2

小提琴

于 2013-03-04T07:23:41.283 回答