Announcement

Collapse
No announcement yet.

SQL Abfrage mit mehreren Subselects

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Abfrage mit mehreren Subselects

    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:

    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;
    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

  • #2
    Wenn Du zwei Tabellen verknüpfen willst und Du in dem JOIN auf jeden Fall ALLE Datensätze einer Tabelle haben möchtest, dann musst du einen OUTER JOIN verwenden.

    Comment


    • #3
      Hat sich erledigt, habe es so gemacht(Delphi Code):

      Code:
      query1.SQL.Text:='SELECT A.ARARTN, B.OZSTZT, B.OZLOGR, B.OZLOAR, C.TTTX60, D.PNNAME '+
                           'FROM '+auftragsartikel+' A '+
                              'JOIN '+offene_posten+' B ON B.OZAUN7 = A.ARAUN7 '+
                              'JOIN '+auftragstexte+' C ON C.TTTXSL = B.OZSPME '+
                              'LEFT JOIN '+login_src+' D ON D.PNPERN = B.OZPERN '+
                           'WHERE '+
                              'A.ARAUN7='+AB+' AND A.ARPONR='+PON+' '+
                              'AND B.OZAUN7='+AB+' '+
                              'AND B.OZPONR='+PON+' '+
                              'AND B.OZBTRZ=400 '+
                              'AND C.TTTXAR LIKE '+#39+'AG'+#39;
      Trotzdem Danke...

      Comment

      Working...
      X