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
私がやろうとしているのは、前の行の列tickets
とoffset
(同じ計算された列) に基づいて各行のオフセットを計算することです。最初の行はオフセット 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 データベースの最初のクエリに似たものを実装する方法について何か考えはありますか?