Hallo,
Das kartesische Produkt der beiden Tabellen ergibt sich als
*CROSS JOIN*
und nichts anderes. CROSS JOIN, nicht LEFT JOIN, nicht INNER JOIN!
Es sei denn, ihnen wären keine Bedingungen mitgegeben?
Nein, ein OUTER JOIN ohne Bedingung ist sinnlos.
Ein INNER JOIN ohne Bedingung ebenfalls.
Dann willst Du einen CROSS JOIN.
Dann schreibe auch CROSS JOIN und betreibe keinen Etikettenschwindel.
Nein, Du kannst nicht alles mit WHERE erreichen (es sei denn, das DBMS bietet eine proprietäre Syntax für OUTER JOINs über die WHERE-Klausel wie z.B. Oracle oder MS SQL-Server).
Aha. Einen Teil konnte man, aber gut zu wissen, dass nicht alles geht.
Einen INNER JOIN kannst Du stets implizit schreiben, wie Du in Rouvens Artikel nachlesen kannst. Ich bevorzuge wegen der Klarheit, Einfachheit und geringeren Fehleranfälligkeit die explizite Join-Syntax, die bereits seit ca. 10 Jahren (und mehr) von allen (jetzt) relevanten DBMS unterstützt wird.
Beispiel mit Erläuterungen: /archiv/2008/4/t170482/#m1114517
liefert wegen der speziellen Behandlung von NULL-Werten bei Vergleichen nur folgende Datensätze zurück, die Gremien, denen die Person mit der id 10 angehört:
id | bezeichnung | id_person
1 | Spiel | 10
3 | Jugend | 10
Führst Du jedoch die Einschränkung auf die Person mit der id 10 in der Join-Bedingung auf, so erhältst Du alle Gremien:
Wieso hebt das AND die Null-Zeilen nicht auf, das WHERE aber wohl? Sind die beim "WHERE" schon "weg"?
Ja: Der Vergleich NULL = 10 liefert false
Der Vergleich NULL = NULL übrigens auch.
Oder fliegen die durch das WHERE raus? Ich vermutete jetzt, dass erstmal nur INNER JOIN eine Art Schnittmenge bzw. Teilmenge mit dem Zusatz: "ohne Leere Elemente" liefert.
Der INNER JOIN liefert genau die Datensätze beider beteiligten Tabellen, die die Bedingung erfüllen, keine anderen.
Ein OUTER JOIN liefert *alle* Datensätze der einen Tabelle, auch wenn es für diese keine Entsprechungen gemäß der Join-Bedingung in der zweiten Tabelle gibt. Spalten, die aus der zweiten Tabelle stammen, haben dann den Wert NULL.
Deswegen ist doch ein OUTER JOIN *ohne* Joinbedingung so völlig sinnfrei. Dann willst Du keinen OUTER JOIN und dann schreibst Du auch nicht OUTER JOIN dran. Auf einen Briefumschlag, der nur in ein anderes Stadtviertel soll, schreibst Du ja auch nicht AIRMAIL drauf.
Zurück zum Beispiel:
Die WHERE-Klausel filtert aus der Ergebnismenge die gewünschten Datensätze heraus, d.h. diejenigen, für die die WHERE-Bedingung zutrifft. Daher fliegen die beiden Datensätze mit
id_person = NULL
heraus.
Die JOIN-Bedingung dient jedoch zur Ermittlung der Ergebnismenge. Daher enthält die Ergebnismenge alle Datensätze aus der Gremientabelle. Gibt es keine Datensätze in der mitglieder-Tabelle, die der JOIN-Bedingung entsprechen so enthalten alle Spalten der Ergebnismenge, die aus der mitglieder-Tabelle stammen, für diese Datensätze den NULL-Wert - weil wir einen OUTER JOIN verwendet haben. Deswegen hat nach Verschiebung der Bedingung, um welche Person es sich handelt, aus der WHERE-Klausel in die JOIN-Bedingung einen dramatischen Effekt auf das Ergebnis der Abfrage.
Spezialfälle sind gut und schön, beim Erlernen der Grundlagen jedoch nur hinderlich. Du beschäftigst Dich Stunden mit nichtvorhandenen Problemen. Hast Du jedoch die Grundlagen verstanden, so sind die Spezialfälle gleich mit erledigt.
Das Schlimme an diesen meinen Ausführungen ist, dass das alles in Rouvens und meinem Artikel drinsteht - die Du doch gelesen hast.
Freundliche Grüße
Vinzenz