【问题标题】:Oracle 10g Recursive QueryOracle 10g 递归查询
【发布时间】:2013-03-01 05:57:38
【问题描述】:

我有以下递归查询,可以在 11g 中运行,但在 Oracle 10g 数据库中不受支持:

with st as (
    select
        rownum id,
        case  
            when rownum-1 < 1 then null
            else rownum-1
        end parent_id,
        customer, 
        tickets
    from tickets
),
st2(id, parent_id, customer, tickets, offset) as (
        select
            id, parent_id, shuffler_id, subno, contrno, tickets, 0 offset
        from st
        where id = 1
    union all
        select
            st2.id, st2.parent_id, st2.tickets, (st.tickets + st.offset) offset
        from st, st2
        where st2.parent_id = st.id
)
select * from st2

我要做的是根据前一行的列ticketsoffset(相同的计算列)计算每一行的偏移量,我从偏移量为 0 的第一行开始;在执行查询期间我需要依赖我正在计算的列这一事实需要递归。

问题是 Oracle 10g 不支持上述查询,所以我尝试使用 connect by 代替它,但它的丑陋部分是效率极低:

with st as (
    select
        rownum id,
        case  
            when rownum-1 < 1 then null
            else rownum-1
        end parent_id, 
        customer,
        tickets
    from tickets
)
select
    id, 
    parent_id,
    customer,
    tickets,
    (
        select nvl(sum(tickets), 0) from st
        where level <  x.id
        start with id = 1
        connect by prior id = parent_id
    ) offset
from st x

使用第二个查询,我将所有之前的行相加,这可以完成这项工作,但也是多余的,我不能依赖该表何时增长到数百万条记录。

关于如何在 Oracle 10g 数据库中实现类似于第一个查询的任何想法?

【问题讨论】:

    标签: sql oracle recursion oracle10g


    【解决方案1】:
      select 
        id, 
        customer,
        tickets,
        nvl(
          sum(tickets) over (
            order by id rows between unbounded preceding and 1 preceding
          ), 0) as offset
      from (    
        select
            rownum id,
            customer, 
            tickets
        from tickets
      )
    

    甚至更短(不引入ids)

      select 
        customer,
        tickets,
        nvl(
          sum(tickets) over (
            order by rownum rows between unbounded preceding and 1 preceding
          ), 0) as offset
      from tickets
    

    【讨论】:

    • 我很好奇,这看起来仍然是对每一行的所有前面的行求和来计算偏移量,这仍然是多余的,但比我做的要快得多!有没有办法通过重用已计算的上一行的偏移量来加快速度?
    • @abstractpaper - 解析函数sum 具有最优的计算复杂度。我不知道如何让它更快。
    • 没关系,这是最优的,它正在做我想做的事,它正在重用以前的偏移量!
    • Egor,我正在考虑用一个更简单的例子将这个问题改写为一个更通用的问题,这个问题看起来太长了,如果简化,可能会为更多的观众服务。你介意我创建一个新的并且你提供相同的答案吗?
    • @abstractpaper - 如果您以问答方式创建新问题并自己回答,我不介意。
    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 2013-10-31
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多