Wolfgang: Query mit LEFT JOIN

Hallo an Alle,

ich habe von meinem Server aus eine relativ komplexe DB-Abfrage. Da ich hier fünf zusammenhängende Tabellen abfrage, gestaltet sich das ganze sehr zeitaufwändig.

Zur Erklärung:

Tabelle 1:   Bestellkopf
Tabelle 2:   Bestellposition
Tabelle 3:   Positionseinteilung
Tabelle 4:   Personaldaten
Tabelle 5:   Einteilungszusatzdaten

Die Abfrage geht über eine ODBC-Schnittstelle auf eine DB2 Datenbank.
Mit den normalen JOINS kommt aber meistens ein leerer Result zurück, da die Tabelle 4 und 5 nicht zu jeder Einteilung Daten haben.

Momentan sieht das ganze ungefähr so aus (for-Schleifen). In Klammern steht mal die höchstzahl an Bestellungen, die auf einmal ausgelesen werden können.

Query Bestellkopf (243)
  Query Bestellposition               //wird 243mal druchlaufen
    Query Positoinseinteilung         //wird 243 mal plus zusätzliche Positonen durchlaufen
      Query Personaldaten             //wird so oft wie Einteilungen durchlaufen
        Query Einteilungszusatzdaten. //gleich wie eins davor

In Sekunden ausgedrückt benötigt diese Abfrage 40 Sekunden. Also viel zulang. (Vermutlich ist die ODBC-Schnittstelle so langsam). Wenn ich nun mal die ersten drei Query, bei denen immer Daten vorhanden sind zu einer Query zusammenfasse, bin ich schon bei 16 Sekunden. (Besser, aber immer noch zu langsam). Nun würde ich gerne alle fünf Querys zusammenfassen.

Das geht aber nur mit LEFT JOIN. Denn wenn zu einer Einteilung in den Tabellen 4 und 5 nichts verwaltet, wird diese ignoriert.

Jetzt endlich mal die Frage.

Mit der Beschreibung auf der mySQL Seite bin ich nicht weiter gekommen. Kann mir bitte jemand ein Beispeil für eine Quer mit LEFT JOIN geben, wo zu einer Tabelle (zusätzlich zu den JOINS zwischen den einzelnen Tabellen) noch weitere Parameter, z.B. Bestelltyp, etc. abgefragt werden kann.

Viele Dank für Eure Hilfe

Viele Grüße Wolfgang

  1. Hi,

    also der LEFT JOIN funktioniert eigentlich ganz einfach, die Einschränkung auf bestimmte Datensätze kannst du entweder mit einer generellen WHERE-Klausel am Ende oder mit einem Subselect vor dem JOIN machen, wobei ich mir nicht sicher bin ob die DB2 das über ODBC durchlässt, bei Direktverbindungen macht sie es in jedem Fall:
    Möglichkeit 1
    SELECT tab1.feld3, tab2.feld3
    FROM tab1
    LEFT JOIN tab2
    ON tab1.feld1 = tab2.feld1
    WHERE tab1.feld2 = 'Wert'
      AND tab2.feld2 = 'Gesucht'

    Möglichkeit 2
    SELECT a.feld3, b.feld3
    FROM (
     (SELECT feld1, feld3
      FROM tab1
      WHERE feld2 = 'Wert'
     ) a

    LEFT JOIN

    (SELECT feld1, feld3
      FROM tab2
      WHERE feld2 = 'Gesucht'
     ) b
     ON a.feld1 = b.feld1
    )

    Wenn ich mich nicht irgendwo vertan habe sollten beide Abfragen das selbe Ergebnis liefern, es gibt genug Diskussionen ob Subselects nicht schlechter sind als "normale" Abfragen, bei uns in der Firma sind sie auf der DB2 standardmäßig im Einsatz und helfen bei massiv eingesetzten JOINs die Datenmengen zu reduzieren...

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hallo Rouven,

      habe es nicht nur mit left joins lösen können. Ich konnte meine bisherigen "normalen" Joins nicht verwenden. Also musste ich alles mit left, oder eben right joins machen. Jetzt klappts jedenfalls. Die reine Abfragezeit beträgt jetzt nur noch ne halbe Sekunde. Die anderen 7 Sekunden liegen an dem lahmen Prozessor für den Bildaufbau.

      Dank nochmal

      Viele Grüße

      Wolfgang