Query mit LEFT JOIN
Wolfgang
- datenbank
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
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
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