FULL OUTER JOIN in MySQL?

1 minute read

V MySQL pogrešam malo morje možnosti. FULL OUTER JOIN je ena od njih, ampak se ga da z malo motoviljenja vseeno izvesti.

Najprej, kaj sploh je OUTER JOIN. OUTER JOIN ne zahteva, da so v združenih tabelah vsi ujemajoči se zapisi, namesto tega manjkajoči zapis nadomesti z vrednostmi NULL. Verjetno ste se vsi že srečali z LEFT OUTER JOIN, v MySQL ga lahko uporabimo kar s skrajšanim LEFT JOIN. Nekateri ste mogoče uporabili tudi že RIGHT OUTER JOIN, ravno tako lahko skrajšan na RIGHT JOIN je na voljo v MySQL.

Primer LEFT OUTER JOIN, če združimo tabeli a in b, v obeh imamo samo polje id, v vsaki po dva zapisa, v tabeli a zapisa 1 in 2, v tabeli b pa zapisa 1 in 3:

SELECT *
    FROM a LEFT JOIN b ON a.id = b.id;
+----+----+
|a.id|b.id|
+----+----+
|   1|   1|
|   2|NULL|
+----+----+

Primer RIGHT OUTER JOIN na istih tabelah:

SELECT *
    FROM a RIGHT JOIN b ON a.id = b.id;
+----+----+
|a.id|b.id|
+----+----+
|   1|   1|
|NULL|   3|
+----+----+

Kaj pa bi naredil FULL OUTER JOIN, če bi ga MySQL seveda omogočal?

SELECT *
    FROM a FULL OUTER JOIN b ON a.id = b.id;
+----+----+
|a.id|b.id|
+----+----+
|   1|   1|
|   2|NULL|
|NULL|   3|
+----+----+

Uporabna zadeva, vendar žal v MySQL neizvedljiva. Ali pač?

Ker pač ne obupam tako hitro, sem seveda našel rešitev, bolje rečeno workaround. Z uporabo UNION. Poglejmo:

SELECT *
    FROM a LEFT JOIN b ON a.id = b.id
UNION
SELECT *
    FROM a RIGHT JOIN b ON a.id = b.id;
+----+----+
|a.id|b.id|
+----+----+
|   1|   1|
|   2|NULL|
|NULL|   3|
+----+----+

Jupi! Pa ga imamo, ne izgleda preveč lepo, deluje pa vseeno :)

Updated: