2016-07-29 1 views
0

나는 날짜 범위를 축소하는 진술을 가지고 있으며, iteself로 SQL을 실행할 때 및 해당 행을 중첩 된 테이블에 삽입 할 때 올바른 축소 된 버전을 얻고 있습니다. 절차 나는 다른 행에 쓰러져 있어야했던 행을 얻고있다. 그래서다른 위치에서 실행되는 동일한 명령문에서 2 개의 다른 행 수를 얻고 있습니다.

  SELECT client_pk, 
        plan_id, 
        grp, 
        MIN(start_dt) start_dt, 
        MAX(end_dt) end_dt 
       FROM (
       SELECT client_pk 
         plan_id, 
         start_dt, 
         end_dt, 
         MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp 
        FROM (
        SELECT mp.client_pk, 
          mp.plan_id, 
          CASE 
           WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND 
                                 NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) 
            THEN NULL 
          ELSE ROWNUM 
          END grp, 
          mp.start_dt, 
          NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt 
         FROM client_plan mp 
         ) 
        ) 
       GROUP BY grp, plan_id, client_pk 

나는의 ROWNUM 제공하기 위해 내부 대부분의 쿼리에서 설정 초기 결과가 있습니다

client_pk PLAN_ID GRP start_dt end_dt 
8752  25171 3 1/1/2016 3/31/2016 
8752  25171 1 2/1/2016 1/31/2016 

및 독립 실행 형 쿼리로 실행할 때 말, 적절하게 축소되어

client_pk PLAN_ID GRP start_dt end_dt 
8752  25171 3 1/1/2016 3/31/2016 

그러나 이러한 레코드를 결국 DB에 삽입되는 중첩 테이블로 덤프하는 프로 시저를 실행하면 두 행이 여전히 반환됩니다.

SELECT plan_spans_obj(client_pk, plan_id, start_dt, end_dt) 
     BULK COLLECT INTO plan_spans_ins_tbl 
     FROM ( 
     SELECT client_pk, 
       plan_id, 
       start_dt, 
       end_dt 
     FROM (SELECT client_pk, 
         plan_id, 
         grp, 
         MIN(start_dt) start_dt, 
         MAX(end_dt) end_dt 
        FROM (
        SELECT client_pk 
          plan_id, 
          start_dt, 
          end_dt, 
          MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp 
         FROM (
         SELECT mp.client_pk, 
           mp.plan_id, 
           CASE 
            WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND 
                                  NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) 
             THEN NULL 
           ELSE ROWNUM 
           END grp, 
           mp.start_dt, 
           NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt 
          FROM client_plan mp 
          ) 
         ) 
        GROUP BY grp, plan_id, client_pk 
       ) 
      ); 

그래서 어떻게, 동일한 쿼리에서 2 개 개의 다른 결과 만 다르게 실행을 얻고 것은 그것이 실행되는 위치에 따라 서로 다른 동작의 순서입니다.

또한 추가 레코드는 본질적으로 음수 시간 범위이며 종료 날짜는 시작 날짜보다 이전이지만 이는 쿼리에서 처리됩니다.

+0

해당 client_pk 및 plan_id에 대한 원시 데이터를 추가 할 수 있습니까? 나는 당신이'ROWNUM'을 학대하고 있기 때문에 그것이 확실하다고 확신합니다, 그러나 나는 그것을 다시 쓰기 전에 그것을 재현 할 수 있기를 바랍니다. –

답변

0

대답은 컬렉션을 초기화하지 않았다는 것입니다. 그런 것 같지만 분명히 그렇게 믿을 수는 없습니다. 지금 일하고있는 것 같습니다.

+0

컬렉션을 대량 수집하기 전에 컬렉션을 초기화 할 필요가 없습니다. 커밋되지 않은 변경 사항이있을 수 있습니까? 아직 작동하는 한 .. –

+0

커밋되지 않은 변경 사항이 내 첫 번째 생각이었습니다 ... 누가 알습니까. – mathguy

관련 문제