【问题标题】:PL- SQL recursive functionPL-SQL 递归函数
【发布时间】:2013-03-04 06:11:49
【问题描述】:

我是 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_FLAG 2 的子ID。

FFAM_UPPER_ACC_ID 是父 ID,FFAM_GROUP_FLAG 确定该行是否为组。

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

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

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

SQL fiddle

【问题讨论】:

    标签: plsql oracle10g plsqldeveloper


    【解决方案1】:

    您实际上不需要递归过程,甚至根本不需要过程:改用hierarchical queries

    这应该做你想做的(至少在你提供的输入上工作):

    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;
    

    【讨论】:

    • 层次查询不是递归的:-)?它只是隐藏在数据库引擎中,而不是为了查看而布局。
    • 分层查询对我有用,但如果我想创建一个递归函数怎么办?
    • 正如@Ben 所说,这已经是递归的,只是你没有“手动”进行递归。如果你想手工做,那就去做吧。执行一个过程,在给定“父”ID 列表的情况下选择“子”,然后递归调用它。可能有点棘手,而且效率也不高。
    【解决方案2】:
    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
    

    fiddle

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2020-04-01
      相关资源
      最近更新 更多