2013-03-13 2 views
0

나는 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 

난 할 노력하고있어 것은이 기준으로 각 행에 대해 오프셋을 계산하는 것입니다 이전 행의 열 ticketsoffset (같은 계산 된 열)에서 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 데이터베이스의 첫 번째 쿼리와 비슷한 것을 구현하는 방법에 대한 아이디어가 있습니까?

답변

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 
) 

또는 더 짧은 여전히 ​​정지되는 오프셋을 계산하기 위해 각각의 단일 행에 대한 모든 위의 행을 합산처럼

select 
    customer, 
    tickets, 
    nvl(
     sum(tickets) over (
     order by rownum rows between unbounded preceding and 1 preceding 
    ), 0) as offset 
    from tickets 
+0

내가 궁금가이 보인다 (id의 도입없이) 중복되었지만 내가했던 것보다 훨씬 빠릅니다! 이미 계산 된 이전 행의 오프셋을 재사용하여이 작업을 더욱 빠르게 수행 할 수 있습니까? – abstractpaper

+0

@abstractpaper - 분석 함수'sum'은 최적의 계산 복잡성을 가지고 있습니다. 나는 그것을 더 빨리 만드는 법을 모른다. –

+0

신경 쓰지 마세요. 이것이 최적이고 원하는대로하고 있습니다. 이전 오프셋을 재사용 중입니다! – abstractpaper