Inner Join vs. Outer Join: verbleibende Zeilen, NULL, Left und Right Outer Join und SQL-Syntax
Ein Join kombiniert die Zeilen zweier Tabellen nach der in ON angegebenen Bedingung (meist, dass ein Fremdschlüssel gleich einem Primärschlüssel ist) zu einer Ergebnistabelle. Ein Inner Join behält nur die Kombinationen von Zeilen, die einen passenden Partner haben; Zeilen ohne Partner verschwinden aus beiden Tabellen. Ein Outer Join behält die passenden Kombinationen und zusätzlich die Zeilen der angegebenen Tabelle, auch wenn sie keinen Partner haben, und füllt die Spalten der anderen Tabelle mit NULL. Ein Left Outer Join (LEFT OUTER JOIN) behält jede Zeile der linken Tabelle, ein Right Outer Join (RIGHT OUTER JOIN) die der rechten, und ein Full Outer Join (FULL OUTER JOIN) die beider. Entscheidend ist, ob Zeilen ohne Partner im Ergebnis erscheinen sollen.
| Merkmal | Inner Join (INNER JOIN) | Outer Join (OUTER JOIN) |
|---|---|---|
| Zeilen im Ergebnis | Nur Kombinationen von Zeilen, die die Join-Bedingung erfüllen | Passende Kombinationen plus die Zeilen der zu behaltenden Tabelle, die keinen passenden Partner haben |
| Zeilen ohne Partner | Werden aus dem Ergebnis entfernt, aus beiden Tabellen | Zeilen der behaltenen Tabelle bleiben als je eine Zeile erhalten, die Spalten der anderen Tabelle werden NULL; Zeilen ohne Partner aus der anderen Tabelle werden entfernt |
| Arten | Eine Art; INNER kann entfallen, dann schreibt man nur JOIN | Drei Arten: links (LEFT), rechts (RIGHT) und vollständig (FULL); OUTER kann entfallen |
| SQL-Beispiel | SELECT … FROM Mitarbeiter INNER JOIN Abteilung ON Mitarbeiter.AbteilungsID = Abteilung.AbteilungsID | SELECT … FROM Mitarbeiter LEFT OUTER JOIN Abteilung ON Mitarbeiter.AbteilungsID = Abteilung.AbteilungsID |
| Beispiel für die Zeilenzahl (4 Mitarbeiter, einer davon mit NULL als AbteilungsID; 3 Abteilungen, eine davon ohne Mitarbeiter) | 3 Zeilen: Der Mitarbeiter mit NULL als AbteilungsID und die Abteilung ohne Mitarbeiter erscheinen nicht | 4 Zeilen bei einem Left Outer Join, der die Mitarbeitertabelle behält (der Mitarbeiter mit NULL als AbteilungsID erhält NULL als Abteilungsnamen); 5 Zeilen bei einem Full Outer Join, der beide behält |
| Reihenfolge der Tabellen | Vertauschen von links und rechts ergibt dieselben Zeilen (nur die Spaltenreihenfolge ändert sich) | Bei Left und Right Outer Join hängt das Ergebnis davon ab, welche Tabelle links steht; A LEFT OUTER JOIN B liefert dieselben Zeilen wie B RIGHT OUTER JOIN A |
| Bedingungen auf Spalten der anderen Tabelle | Gleiches Ergebnis, ob in ON oder in der WHERE-Klausel geschrieben | In der WHERE-Klausel erfüllen die mit NULL gefüllten Zeilen die Bedingung nicht und verschwinden, was dasselbe Ergebnis wie ein Inner Join ergeben kann; um Zeilen ohne Partner zu behalten, schreibt man sie in ON |
| Typischer Einsatz | Wenn nur Daten gewünscht sind, die in beiden Tabellen vorhanden sind (z. B. Bestellungen um Kundennamen ergänzen) | Wenn auch Zeilen ohne Partner aufgelistet werden sollen (z. B. alle Mitarbeiter einschließlich derer ohne Abteilung) oder wenn Zeilen ohne Partner gesucht werden |
Die Zahlenwerte sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.