Site x5

OUTER JOIN

Der LEFT OUTER JOIN

Tabelle L
Tabelle L
Tabelle R
Tabelle R

Der RIGHT OUTER JOIN

Tabelle L
Tabelle L
Tabelle R
Tabelle R

Mit den OUTER JOINS bekommt man zunächst alle Zeilen die auch ein INNER JOIN liefern würde, erhält dann aber zusätzlich ALLE Zeilen aus der linken oder rechten Tabelle.

Mit linker Tabelle ist die erstgenannte Tabelle gemeint:

SELECT ... FROM tabelle_links
...

Mit rechter Tabelle ist die zweitgenannte Tabelle gemeint:

SELECT ... FROM tabelle_links
LEFT | INNER | RIGHT JOIN tabelle_rechts
...

Syntax von LEFT OUTER JOIN

SELECT ... FROM tabelle_l
LEFT OUTER JOIN tabelle_r ON <Bedingung>;

Das Wort OUTER ist optional und kann auch weggelassen werden:

SELECT ... FROM tabelle_l
LEFT JOIN tabelle_r ON <Bedingung>;

Wofür braucht man das?

Wir haben beim INNER JOIN gesehen, dass die rot markierten Datensätze nicht in der Ergebnistabelle auftauchen, sie hatten keinen JOIN-Partner in der anderen Tabelle:

SELECT * 
FROM Mitarbeiter m
    INNER JOIN Abteilung a
    ON m.abteilung = a.id;
Mitarbeiter
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
1
1
Adam
Adam
Heim
Heim
2
2
2
2
Julia
Julia
Klein
Klein
2
2
3
3
Lorenz
Lorenz
Knack
Knack
3
3
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
5
5
Otto
Otto
Karl
Karl
NULL
NULL
Abteilung
id
id
name
name
1
1
Personal
Personal
2
2
IT
IT
3
3
Produktion
Produktion

Manchmal will man an genau diese Datensätze ran, da alleine die Existenz (oder nicht-Existenz) dieser Datensätze schon Informationen enthält.

Mit einem LEFT [OUTER] JOIN kann man rausfinden, welche Datensätze aus der linken Tabelle kein Match in der rechten Tabelle haben. Damit kann man z.B. Fragen beantworten wie:

Anwenden

Wir wollen jetzt rausfinden, welche Mitarbeiter noch keiner Abteilung zugewiesen sind. Dafür nehmen wir den INNER JOIN Query und ersetzen INNER durch LEFT OUTER:

SELECT * 
FROM Mitarbeiter m
    LEFT OUTER JOIN Abteilung a
    ON m.abteilung = a.id;
Ergebnistabelle
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
id
id
name
name
1
1
Adam
Adam
Heim
Heim
2
2
2
2
IT
IT
2
2
Julia
Julia
Klein
Klein
2
2
2
2
IT
IT
3
3
Lorenz
Lorenz
Knack
Knack
3
3
3
3
Produktion
Produktion
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
NULL
NULL
NULL
NULL
5
5
Otto
Otto
Karl
Karl
NULL
NULL
NULL
NULL
NULL
NULL

Wir bekommen die gleichen Ergebniszeilen wie mit dem INNER JOIN, bekommen zusätzlich aber noch die restlichen Zeilen aus Tabelle 1. Dort wo die Daten aus Tabelle 2 kommen würden, wird mit NULL aufgefüllt.

Diese NULL - Werte kann man sich zunutze machen. Wir filtern jetzt nach den Zeilen, in denen die Spalte Abteilung.id den Wert NULL hat:

SELECT * 
FROM Mitarbeiter
    LEFT OUTER JOIN Abteilung
    ON Mitarbeiter.abteilung = Abteilung.id
WHERE Abteilung.id IS NULL;

Beachten Sie, dass zum Testen auf NULL IS NULL oder IS NOT NULL verwendet werden muss, anstatt einen Vergleichoperator zu verwenden (Abteilung.id = NULL). https://www.w3schools.com/sql/sql_null_values.asp