OracleSQL - Abfragen zusammenführen in einer Abfrage (Live und Historische Daten)

dhuuk42

Grünschnabel
Hallo zusammen,

ich habe folgendes Problem. In einem System werden Daten nach erreichen eines gewissen Status aus der Live Tabelle in eine History Tabelle verschoben.

Für einen Report den ich erstelle benötige ich jedoch alle Daten um beispielweise die Gesamtpicks pro Tag dem aktuellen Fortschritt gegenüberzustellen. Die Gesamtpicks kann ich jedoch nur ermitteln, wenn ich die Daten aus beiden Tabellen (Live und History) per Excel mit Makro zusammenführe. Diesen Umweg würde ich mir in Zukunft gerne sparen.

Anbei meine Abfrage für die Live und die History Tabelle. Beide Tabellen sind von der Struktur her (Anzahl Spalten gleich). Kriterium für die Abfrage ist das ermittelte Lieferdatum des Auftrags.

Quellcode für LIVE Abfrage
SQL:
select tbl_out_order.id,
       tbl_article.article_no,
       tbl_article.description_1,
       tbl_out_order_pos.quantity,
       tbl_out_order_pos.picked_quantity
  from tbl_out_order,
       tbl_out_order_pos,
       tbl_charge,
       tbl_article
 where tbl_out_order.id = tbl_out_order_pos.out_order_id
       and tbl_charge.id = tbl_out_order_pos.charge_id
       and tbl_article.id = tbl_charge.article_id
       and tbl_out_order.host_delivery_date between &Beginn and &Ende;

Quellcode für History Abfrage
SQL:
select tbl_out_order[B]_his[/B].id,
       tbl_article.article_no,
       tbl_article.description_1,
       tbl_out_order_pos[B]_his[/B].quantity,
       tbl_out_order_pos_his.picked_quantity
  from tbl_out_order[B]_his[/B],
       tbl_out_order_pos[B]_his[/B],
       tbl_charge,
       tbl_article
 where tbl_out_order[B]_his[/B].id = tbl_out_order_pos[B]_his[/B].out_order_id
       and tbl_charge.id = tbl_out_order_pos[B]_his[/B].charge_id
       and tbl_article.id = tbl_charge.article_id
       and tbl_out_order[B]_his[/B].host_delivery_date between &Beginn and &Ende;

Jetzt zu meiner Frage. Gibt es eine Möglichkeit beide Abfragen in einer Abfrage zu vereinen? So dass ich in einem Report sämtliche Datensätze aus beiden Tabellen habe?

Danke für Eure Hilfe und Beste Grüße,

dhuuk42
 
Ok hab mich reingelesen. Verstehe ich soweit und konnte ich auch mit einer Tabelle nachbauen. Was ist aber mit den anderen Verknüpfungen? Was verschachtelte SQL Statements angeht bin ich ein absoluter Anfänger.
 
Wieso Verschachtelt?
Du Hast gefragt wie man die Daten zusammensetzt. Die Antwort ist UNION.
Eine weitere Frage sehe ich nicht.
 
Moin dhuuk42,

das ganze Geraffel könnte dann so in etwa aussehen:

SQL:
SELECT u.quelle.id,
       u.host_delivery_id,
       a.article_no,
       a.description_1,
       u.quantity,
       u.picked_quantity
FROM (
SELECT 'LIVE' as Quelle,
       oo.id,
       oo.host_delivery_date,
       oop.quantity,
       oop.picked_quantity
       oop.charge_id
  FROM tbl_out_order oo,
       tbl_out_order_pos oop
 WHERE oo.id = oop.out_order_id
       AND oo.host_delivery_date BETWEEN &Beginn AND &Ende
UNION ALL

SELECT 'History' as Quelle,
       oo.id,
       oo.host_delivery_date,
       oop.quantity,
       oop.picked_quantity,
       oop.charge_id
  FROM tbl_out_order_his oo,
       tbl_out_order_pos_his oop
 WHERE oo.id = oop.out_order_id
       AND oo.host_delivery_date BETWEEN &Beginn AND &Ende
) u
INNER JOIN tbl_charge c on c.id = u.charge_id
INNER JOIN tbl_article a on a.id = c.article_id
ORDER BY u.article_no, u.host_delivery_id
/*
-- oder ...ORDER BY u.article_no, u.quelle DESC, u.host_delivery_id DESC
-- =nach Atikelnummer, zuerst die LIVE-Daten, neueste Lieferdaten zuerst
*/

Ich habe noch ein Feld "Quelle" eingefügt, damit unterscheidbar ist, von wo (Live/History) die Daten kommen.
Außerdem gebe ich noch das Feld "host_delivery_date mit aus, weil du ja sicherlich nach irgendwas sortieren willst.

Da du geschrieben hast:
"In einem System werden Daten nach erreichen eines gewissen Status aus der Live Tabelle in eine History Tabelle verschoben."
schlussfolgere ich: die Daten liegen entweder in LIVE oder in History vor, deshalb reicht ein UNION ALL (statt UNION).
Der "Status" scheint für den Report nicht relevant zu sein, jedenfalls gibst du den nicht aus.

Ungetestete Skizze.

Grüße
Biber
 
Zuletzt bearbeitet:
Ok, ich kann es nachvollziehen. Aber leider sagt er mir jetzt: "ORA-9004: "U"."CHARGE_ID": ungültiger Bezeichner.

Wenn ich es richtig verstehe, bringt Union die Datensätze zusammen und mit Hilfe von ") u" initialisiert man u als variable für tbl_out_order_pos oder?
 
Zuletzt bearbeitet:
Moin dhuuk42,

mein Fehler, ich hatte versäumt, das Feld "charge_id" mit in den UNION aufzunehmen.
Das wird zwar nicht mit ausgegeben in deinem Bericht, aber benötigt für dein JOIN mit der Charge-tabelle.
Habe ich oben korrigiert im Statement.

zu "mit Hilfe von on ") u" initialisiert man u als variable für out_order_pos.charge_id oder?"

Ja, nee... so ungefähr....
Dem ganzen UNION-Resultset (" SELECT <bla> FROM LIVE UNION ALL SELECT <bla> FROM History)" gebe ich den Alias-Namen "u" (wie union).

Diesen ganzen Datenklumpen kann ich also als Quasi-Tabelle "u" ansprechen und dieses "u" dann auch mit den Tabellen Artikel alias a und Charge alias c verjoinen.

Probier bitte nochmal die korrigierte Version, evtl habe ich noch mehr Tippfehler drin.
Oder neue. Oder andere. ;)

Grüße
Biber
 

Neue Beiträge

Zurück