Outer Joins unter PostgreSQL
Warum interessieren mich Outer Joins? Naja, weil die Syntax in den verschiedenen Datenbanksystemen unterschiedlich ist und weil ich sie, ehrlich gesagt, immer vermieden habe. Schließlich sind sie auch mit schlechter Performance assoziiert, denn die äußere Tabelle muss immer vollständig gelesen werden. Allerdings spielt das nicht unbedingt eine Rolle, wenn z.B. die Tabelle nur wenige Zeilen umfasst und die Abfrage eher selten ausgeführt wird.
Zur Sache: Wie sieht ein Outer Join unter PostgreSQL aus?
Um die Sache schnell zu verstehen erstellen wir zwei sehr einfache Tabellen:
CREATE TABLE OJ1 (ID INTEGER);
CREATE TABLE OJ2 (ID INTEGER);
Dann fügen wir ein paar Datenzeilen ein, um den Zusammenhang zu verstehen:
INSERT INTO public.oj1 (id) VALUES (1);
INSERT INTO public.oj1 (id) VALUES (2);
INSERT INTO public.oj2 (id) VALUES (1);
INSERT INTO public.oj2 (id) VALUES (3);
Wenn wir jetzt mit einem Outer Join abfragen, können wir grundsätzlich von links nach rechts oder von rechts nach links JOINen. Das ergibt dann im ersten Fall folgendes Ergebnis:
SELECT OJ1.ID ID1, OJ2.ID ID2 FROM OJ1 LEFT JOIN OJ2 ON OJ1.ID = OJ2.ID;
id1 | id2
-----+------
1 | 1
2 | NULL
(2 Zeilen)Im zweiten Fall, von rechts nach links erhalten wir:
SELECT OJ1.ID ID1, OJ2.ID ID2 FROM OJ2 LEFT JOIN OJ1 ON OJ1.ID = OJ2.ID;
id1 | id2
------+-----
1 | 1
NULL | 3
(2 Zeilen)D.h. im ersten Fall wird die erste Tabelle vollständig ausgegeben, mit den geJOINten Zeilen der zweiten Tabelle, wobei Einträge zu denen es in der zweiten Tabelle keine Einträge gibt, als NULL ausgewiesen werden. Im zweiten Fall werden spiegelbildlich alle Zeilen der zweiten Tabelle ausgegeben und die Einträge aus der ersten Tabelle, die nicht zugeordnet werden können, werden ebenfalls als Null zurückgegeben.
Fazit: Es ist doch eine sehr einfache Sache und ich will in Zukunft Mut beim Einsatz von OUTER JOINs zeigen 😎