2016-07-29 6 views
0

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ühren
client_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.

+0

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. –

Antwort

0

Die Antwort war, dass ich die Sammlung nicht initialisiert habe. Ich kann nicht glauben, dass es so etwas war, aber anscheinend so. Scheint jetzt zu arbeiten.

+0

Sie müssen eine Sammlung nicht initialisieren, bevor Sie die Sammelerfassung durchführen. Vielleicht hatten Sie nicht festgeschriebene Änderungen oder etwas? Noch so lange es funktioniert .. –

+0

Unbefugte Änderungen war auch mein erster Gedanke ... Wer weiß. – mathguy

Verwandte Themen