In meinem Beitrag “SQL: Daten verbinden” habe ich einen Überblick der verschiedenen JOIN- und UNION-Typen gegeben. Mich haben jedoch immer wieder Fragen erreicht, was denn der Unterschied zwischen dem FULL JOIN und dem UNION ALL ist, da dies im genannten Beitrag nicht ganz so klar ist. Den Unterschied möchte ich in diesem Beitrag anhand eines Beispiels erläutern.
FULL (OUTER) JOIN vs. UNION ALL
Erstellen wir zunächst einmal 2 einfache Beispiel-Tabellen:
create table example1(id int); insert into example1 values(1); insert into example1 values(2); insert into example1 values(3); insert into example1 values(4); create table example2(id int); insert into example2 values(3); insert into example2 values(4); insert into example2 values(5); insert into example2 values(6);
Die Tabelle “example1” enthält nun folgendes:
id |
---|
1 |
2 |
3 |
4 |
Die Tabelle “example2” enthält folgendes:
id |
---|
3 |
4 |
5 |
6 |
UNION ALL
Starten wir nun mit einem UNION ALL und prüfen, was wir als Ergebnis erhalten:
select id from example1 union all select id from example2
Das Ergebnis sieht wie folgt aus:
id |
---|
1 |
2 |
3 |
4 |
3 |
4 |
5 |
6 |
Wie wir sehen, stapelt ein UNION ALL die gewählten Spalten beider Tabellen aufeinander und inkludiert dabei auch doppelte Werte (mit UNION könnten wir Duplikate herausfiltern). Als Ergebnis erhalten wir also eine Tabelle mit einer Spalte.
FULL JOIN
Wenn wir nun ein FULL JOIN durchführen…:
select e1.id, e2.id from example1 as e1 full join example2 as e2 on e1.id = e2.id
…dann erhalten wir folgendes Ergebnis:
id | id |
---|---|
1 | NULL |
2 | NULL |
3 | 3 |
4 | 4 |
NULL | 5 |
NULL | 6 |
Wir sehen hier, dass FULL JOIN die Daten der Spalten nicht aufeinanderstapelt wie ein UNION ALL, sondern die Spalten der gewählten Tabellen nebeneinander legt. Falls ein Wert in einer Tabelle nicht vorkommt, dann werden die Werte als “NULL” ausgegeben (also nicht vorhanden).