나는 날짜 범위를 축소하는 진술을 가지고 있으며, 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 개 개의 다른 결과 만 다르게 실행을 얻고 것은 그것이 실행되는 위치에 따라 서로 다른 동작의 순서입니다.
또한 추가 레코드는 본질적으로 음수 시간 범위이며 종료 날짜는 시작 날짜보다 이전이지만 이는 쿼리에서 처리됩니다.
해당 client_pk 및 plan_id에 대한 원시 데이터를 추가 할 수 있습니까? 나는 당신이'ROWNUM'을 학대하고 있기 때문에 그것이 확실하다고 확신합니다, 그러나 나는 그것을 다시 쓰기 전에 그것을 재현 할 수 있기를 바랍니다. –