Hallo Leute,
ich programmiere in Delphi und greife über ODBC auf eine DB2-Datenbank einer IBM iSeries zu.
(Habe es trotzdem mal ins SQL Forum gepostet und nicht ins DB2. Hoffe das ist OK.)
Leider stoße ich jetzt an meine SQL-Grenzen bei einer Abfrage mit mehreren Subselects.
Hier ist meine Abfrage:
Code:
Ich muss also Daten aus mehreren Tabellen (bei DB2 physische Dateien) herausfischen und gleiche Felder
verknüpfen. Das geschieht im letzten Absatz der Abfrage.
Die Abfrage läuft problemlos durch, auch die Geschwindigkeit ist absolut in Ordnung.
Es gibt nur folgendes Problem:
Die Tabelle "login_src" beinhaltet wie gesagt den Personalstamm. Jeder Mitarbeiter hat eine Personalnummer --> PNPERN.
In der Tabelle "offene_posten" werden Arbeitsvorgänge rückgemeldet, d.h. gewisse Arbeitsvorgänge (nämlich die schon gemeldeten) haben eine Personalnummer und die noch nicht gemeldeten haben in diesem Feld keinen Eintrag stehen. Der Feldname in der Tabelle lautet --> OZPERN.
Was aber wenn in B.OZPERN noch keine Personalnummer für diesen Datensatz steht und das Feld leer ist?
Dann findet er natürlich auch keine Personalnummer im Subselect D Abschnitt OP.OZPERN=LOG.PNPERN die übereinstimmt.
Folglich ist die Abfrage in der Hauptselektion leer, weil für diesen Datensatz kein Feldeintrag D.PNNAME gefunden
wird.
Mein Wunsch wäre es den Datensatz trotzdem angezeigt zu bekommen, nur das das Feld D.PNNAME halt leer ist, wenn
kein Name gefunden wurde.
Kann man das Statement optimieren, indem man mehrere JOINs verwendet, oder komplett anders rangeht?
Ich hoffe, dass ich euch das Problem einigermassen anschaulich schildern konnte.
PS:
ich habe das SQL-Statement mal allgemein geschrieben und nicht in Delphi-Code. Hoffe das dadurch keine Syntaxfehler reingekommen sind.
Bei den var*** Begriffen handelt es sich um Variablen aus dem Programmcode.
MfG watchdogg
ich programmiere in Delphi und greife über ODBC auf eine DB2-Datenbank einer IBM iSeries zu.
(Habe es trotzdem mal ins SQL Forum gepostet und nicht ins DB2. Hoffe das ist OK.)
Leider stoße ich jetzt an meine SQL-Grenzen bei einer Abfrage mit mehreren Subselects.
Hier ist meine Abfrage:
Code:
Code:
SELECT A.ARARTN, B.OZSTZT, B.OZLOGR, B.OZLOAR, C.TTTX60, D.PNNAME FROM (SELECT ARAUN7, ARPONR, ARARTN FROM auftragsartikel WHERE ARAUN7=varAB AND ARPONR=varPON) AS A, (SELECT OZAUN7, OZPONR, OZSPME, OZSTZT, OZLOGR, OZLOAR, OZAPZN, OZBTRZ, OZPERN, OZKZLF FROM offene_posten WHERE OZAUN7=varAB AND OZPONR=varPON AND OZBTRZ=400) AS B, (SELECT TTTXAR, TTTXSL, TTTX60 FROM auftragstexte WHERE TTTXAR LIKE varAG) AS C, (SELECT OP.OZPERN, LOG.PNPERN, LOG.PNNAME FROM login_src LOG LEFT OUTER JOIN offene_posten OP ON LOG.PNPERN=OP.OZPERN ) AS D WHERE A.ARAUN7=B.OZAUN7 AND A.ARPONR=B.OZPONR AND B.OZSPME=C.TTTXSL;
verknüpfen. Das geschieht im letzten Absatz der Abfrage.
Die Abfrage läuft problemlos durch, auch die Geschwindigkeit ist absolut in Ordnung.
Es gibt nur folgendes Problem:
Die Tabelle "login_src" beinhaltet wie gesagt den Personalstamm. Jeder Mitarbeiter hat eine Personalnummer --> PNPERN.
In der Tabelle "offene_posten" werden Arbeitsvorgänge rückgemeldet, d.h. gewisse Arbeitsvorgänge (nämlich die schon gemeldeten) haben eine Personalnummer und die noch nicht gemeldeten haben in diesem Feld keinen Eintrag stehen. Der Feldname in der Tabelle lautet --> OZPERN.
Was aber wenn in B.OZPERN noch keine Personalnummer für diesen Datensatz steht und das Feld leer ist?
Dann findet er natürlich auch keine Personalnummer im Subselect D Abschnitt OP.OZPERN=LOG.PNPERN die übereinstimmt.
Folglich ist die Abfrage in der Hauptselektion leer, weil für diesen Datensatz kein Feldeintrag D.PNNAME gefunden
wird.
Mein Wunsch wäre es den Datensatz trotzdem angezeigt zu bekommen, nur das das Feld D.PNNAME halt leer ist, wenn
kein Name gefunden wurde.
Kann man das Statement optimieren, indem man mehrere JOINs verwendet, oder komplett anders rangeht?
Ich hoffe, dass ich euch das Problem einigermassen anschaulich schildern konnte.
PS:
ich habe das SQL-Statement mal allgemein geschrieben und nicht in Delphi-Code. Hoffe das dadurch keine Syntaxfehler reingekommen sind.
Bei den var*** Begriffen handelt es sich um Variablen aus dem Programmcode.
MfG watchdogg
Comment