Ich habe eine Anweisung, die Datumsbereiche zusammenbricht, und ich bekomme die richtige reduzierte Version, wenn ich die SQL selbst ausführe und sie in eine geschachtelte Tabelle einfüge Prozedur Ich bekomme eine Zeile, die in die andere Zeile hätte kollabieren sollen.Ich erhalte 2 verschiedene Zeilenzahlen aus derselben Anweisung, die an verschiedenen Stellen ausgeführt wurden
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
So habe ich ein erstes Ergebnis aus der innersten Abfrage gesetzt eine ROWNUM zu geben:
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
und am Ende wird es in geeigneter Weise kollabiert, wenn sie als Stand-alone-Abfrage
ausführenclient_pk PLAN_ID GRP start_dt end_dt
8752 25171 3 1/1/2016 3/31/2016
Wenn jedoch eine Prozedur ausgeführt wird, die diese Datensätze in einer geschachtelten Tabelle ablegt, die dann schließlich in die DB eingefügt wird, werden beide Zeilen weiterhin zurückgegeben.
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
)
);
Wie bin ich 2 immer unterschiedliche Ergebnisse aus der gleichen Abfrage, nur anders ausgeführt, ist es eine Ordnung der Operation unterschiedlich, je nachdem, wo sie ausgeführt wird.
Außerdem ist der zusätzliche Datensatz im Wesentlichen eine negative Zeitspanne, das Enddatum liegt vor dem Startdatum, aber dies wird in der Abfrage behandelt.
Können Sie die Rohdaten für diese client_pk und plan_id hinzufügen? Ich bin mir ziemlich sicher, dass es daran liegt, dass Sie ROWNUM missbrauchen, aber ich würde es gerne reproduzieren können, bevor ich es umschreibe. –