Sql Oracle 10g递归查询

Sql Oracle 10g递归查询,sql,oracle,recursion,oracle10g,Sql,Oracle,Recursion,Oracle10g,我有以下递归查询,它将在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(

我有以下递归查询,它将在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
使用第二个查询,我将对前面的所有行求和,这可以完成任务,但也是冗余的,我无法依赖于此表何时增长到数百万条记录

您知道如何在Oracle 10g数据库中实现类似于第一个查询的功能吗

  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
  )
甚至更短(不引入
id
s)

甚至更短(不引入
id
s)


我很好奇,它看起来仍然在为每一行计算前面所有行的总和来计算偏移量,这仍然是多余的,但比我做的要快得多!有没有办法通过重用前一行已经计算的偏移量来加快计算速度?@abstractpaper-分析函数
sum
具有最佳的计算复杂度。我不知道如何使它更快。不管这是最优的,它正在做我想要的,它是重用以前的偏移量!Egor,我想用一个更简单的例子把这个问题重新表述为一个更一般的问题,这个问题看起来太长了,如果简化的话,可能会为更多的听众服务。你介意我创建一个新问题,你提供相同的答案吗?@abstractpaper-我不介意你创建一个问答式的新问题,然后自己回答。我很好奇,这看起来仍然是对每一行前面的所有行求和来计算偏移量,这仍然是多余的,但比我做的要快得多!有没有办法通过重用前一行已经计算的偏移量来加快计算速度?@abstractpaper-分析函数
sum
具有最佳的计算复杂度。我不知道如何使它更快。不管这是最优的,它正在做我想要的,它是重用以前的偏移量!Egor,我想用一个更简单的例子把这个问题重新表述为一个更一般的问题,这个问题看起来太长了,如果简化的话,可能会为更多的听众服务。你介意我创建一个新问题,而你提供相同的答案吗?@abstractpaper-我不介意你创建一个问答式的新问题,然后自己回答。
  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
  )
  select 
    customer,
    tickets,
    nvl(
      sum(tickets) over (
        order by rownum rows between unbounded preceding and 1 preceding
      ), 0) as offset
  from tickets