나는 11g에서 실행됩니다하지만 오라클 10g 데이터베이스에서 지원되지 않는 다음과 같은 재귀 쿼리가 :오라클 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의 오프셋을 가진 첫 번째 행을 시작할 것입니다. 쿼리를 실행하는 동안 계산중인 열에 의존해야한다는 사실은 재귀가 필요합니다.
문제는 위의 쿼리는 오라클 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 데이터베이스의 첫 번째 쿼리와 비슷한 것을 구현하는 방법에 대한 아이디어가 있습니까?
내가 궁금가이 보인다 (
id
의 도입없이) 중복되었지만 내가했던 것보다 훨씬 빠릅니다! 이미 계산 된 이전 행의 오프셋을 재사용하여이 작업을 더욱 빠르게 수행 할 수 있습니까? – abstractpaper@abstractpaper - 분석 함수'sum'은 최적의 계산 복잡성을 가지고 있습니다. 나는 그것을 더 빨리 만드는 법을 모른다. –
신경 쓰지 마세요. 이것이 최적이고 원하는대로하고 있습니다. 이전 오프셋을 재사용 중입니다! – abstractpaper