Sql Oracle 10g递归查询
我有以下递归查询,它将在11g中运行,但在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(
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