2017-09-06 1 views
0

Ich bin neu in der Welt der PL/SQL und Oracle SQL-Abfragen.Wie über Daten von einer Oracle-Abfrage in einer anderen Abfrage zu iterieren.

Was versuche ich zu erreichen?
Erhalten Sie alle Boxen, die am letzten 100. Tag von heute (Sysdate - 100) mit Label "600" ausgeliefert werden. Von diesen Boxen muss ich die Boxen trennen, die eine aktualisierte Bezeichnung von "50" und "51" haben.

Logic:
1. Holen Sie sich alle Versandkartons auf der letzten 100. mit Label "600". Außerdem erhalten Sie die Anzahl der in den letzten 100 Tagen mit Label "600" versandten Produkte. (ZB, heute ist 09/06, erhalten Sie alle Boxen, die am 29.05 gesendet werden) 2. Holen Sie sich die Anzahl aller Felder, die eine aktualisierte Bezeichnung haben. E.G, am 06/01 einer der Boxen wechselte von "600" -> "50", müsste ich diese Box berücksichtigen.

Ich versuche, einen PL/SQL-Code für diesen Anwendungsfall zu schreiben, und das ist so weit ich erreicht haben.

VARIABLE box_id CHAR(50); 

    BEGIN 
     FOR box_id IN (SELECT 
     box_id, box_lable 
     FROM 
     my.box_table 
     WHERE box_lable = '600' 
     AND trunc(boxed_date) = trunc(SYSDATE - 100) 
     ) LOOP 

     select count(*), box_lable 
     from my.shipping_info si 
     where box_id = si.box_id 
     and box_lable in ('51', '50') 
     group by box_lable 

--COde to print the count of box_label = 600; count of box_label = 51; count of box_label = 50 . 

    END LOOP; 
END; 

Der obige Code wirft einen Fehler in SQL Developer. Ich betreibe dies auf Oracle 11g und Oracle 12c. Ich bin flexibel, jeden Ansatz (nicht unbedingt PL/SQL) zu verwenden, solange die Lösung für Oracle funktioniert.

Können Sie bitte machen Sie uns die Änderungen, die ich brauche, um diesen Code-Schnipsel zu laufen?

+0

Also: Sie haben zwei Tabellen, 'box_table' und' shipping_info'? Ist 'box_id' eindeutig (vielleicht Primärschlüssel) in einer Tabelle und Fremdschlüssel in der anderen? Was ist ein "aktualisiertes" Label - nur ein Label (für dieses 'box_id'), das in der' shipping_info' Tabelle zu finden ist? Das sind alles Informationen, die Sie in Ihrem Beitrag angeben sollten - zusätzlich zum Code, wie Sie es getan haben. – mathguy

Antwort

1

Verwenden Klar SQL mit einer Unterabfrage anstelle von PL/SQL-Schleife:

select box_lable, count(*) 
from my.shipping_info si 
where box_id IN (
     SELECT box_id 
     FROM my.box_table 
     WHERE box_lable = '600' 
     AND trunc(boxed_date) = trunc(SYSDATE - 100) 
) 
    and box_lable in ('51', '50') 
group by box_lable 

berücksichtigen diese Bedingung Umschreiben:

AND trunc(boxed_date) = trunc(SYSDATE - 100) 

in diese ein:

AND boxed_date >= trunc(SYSDATE - 100) 
AND boxed_date < trunc(SYSDATE - 99) 

Dieses ausführlichen scheinen mag, aber hilft, die optimiert besser Ausführungsplan zu wählen, vor allem ermöglicht, auf boxed_date einen Index für die Verwendung, wenn es vorhanden ist (die Funktion trunc(boxed_date) verhindert, dass die optiomizer aus diesem Index verwenden).

+0

Danke! Ich nehme an, du hast mein Problem vereinfacht. Ich denke, das sollte funktionieren – underwood

Verwandte Themen