0

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

2 番目のクエリを使用して、以前のすべての行を合計しています。これは仕事をしますが、同様に冗長であり、このテーブルが何百万ものレコードに成長する時期に依存することはできません。

Oracle 10g データベースの最初のクエリに似たものを実装する方法について何か考えはありますか?

4

1 に答える 1

3
  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
于 2013-03-13T11:24:14.950 に答える