1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

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

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von dhuuk42, 13. September 2017.

  1. dhuuk42

    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
    Code (SQL):
    1. SELECT tbl_out_order.id,
    2.        tbl_article.article_no,
    3.        tbl_article.description_1,
    4.        tbl_out_order_pos.quantity,
    5.        tbl_out_order_pos.picked_quantity
    6.   FROM tbl_out_order,
    7.        tbl_out_order_pos,
    8.        tbl_charge,
    9.        tbl_article
    10.  WHERE tbl_out_order.id = tbl_out_order_pos.out_order_id
    11.        AND tbl_charge.id = tbl_out_order_pos.charge_id
    12.        AND tbl_article.id = tbl_charge.article_id
    13.        AND tbl_out_order.host_delivery_date BETWEEN &Beginn AND &Ende;
    Quellcode für History Abfrage
    Code (SQL):
    1. SELECT tbl_out_order[B]_his[/B].id,
    2.        tbl_article.article_no,
    3.        tbl_article.description_1,
    4.        tbl_out_order_pos[B]_his[/B].quantity,
    5.        tbl_out_order_pos_his.picked_quantity
    6.   FROM tbl_out_order[B]_his[/B],
    7.        tbl_out_order_pos[B]_his[/B],
    8.        tbl_charge,
    9.        tbl_article
    10.  WHERE tbl_out_order[B]_his[/B].id = tbl_out_order_pos[B]_his[/B].out_order_id
    11.        AND tbl_charge.id = tbl_out_order_pos[B]_his[/B].charge_id
    12.        AND tbl_article.id = tbl_charge.article_id
    13.        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
     
  2. sheel

    sheel I love Asm Administrator

  3. dhuuk42

    dhuuk42 Grünschnabel

    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.
     
  4. Yaslaw

    Yaslaw n/a Moderator

    Wieso Verschachtelt?
    Du Hast gefragt wie man die Daten zusammensetzt. Die Antwort ist UNION.
    Eine weitere Frage sehe ich nicht.
     
  5. Biber3

    Biber3 Erfahrenes Mitglied

    Moin dhuuk42,

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

    Code (SQL):
    1. SELECT u.quelle.id,
    2.        u.host_delivery_id,
    3.        a.article_no,
    4.        a.description_1,
    5.        u.quantity,
    6.        u.picked_quantity
    7. FROM (
    8. SELECT 'LIVE' AS Quelle,
    9.        oo.id,
    10.        oo.host_delivery_date,
    11.        oop.quantity,
    12.        oop.picked_quantity
    13.        oop.charge_id
    14.   FROM tbl_out_order oo,
    15.        tbl_out_order_pos oop
    16.  WHERE oo.id = oop.out_order_id
    17.        AND oo.host_delivery_date BETWEEN &Beginn AND &Ende
    18. UNION ALL
    19.  
    20. SELECT 'History' AS Quelle,
    21.        oo.id,
    22.        oo.host_delivery_date,
    23.        oop.quantity,
    24.        oop.picked_quantity,
    25.        oop.charge_id
    26.   FROM tbl_out_order_his oo,
    27.        tbl_out_order_pos_his oop
    28.  WHERE oo.id = oop.out_order_id
    29.        AND oo.host_delivery_date BETWEEN &Beginn AND &Ende
    30. ) u
    31. INNER JOIN tbl_charge c ON c.id = u.charge_id
    32. INNER JOIN tbl_article a ON a.id = c.article_id
    33. ORDER BY u.article_no, u.host_delivery_id
    34. /*
    35. -- oder ...ORDER BY u.article_no, u.quelle DESC, u.host_delivery_id DESC
    36. -- =nach Atikelnummer, zuerst die LIVE-Daten, neueste Lieferdaten zuerst
    37. */
    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: 13. September 2017
  6. dhuuk42

    dhuuk42 Grünschnabel

    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: 13. September 2017
  7. Biber3

    Biber3 Erfahrenes Mitglied

    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
     
Die Seite wird geladen...