SQL

FULL OUTER JOIN in MySQL?

četrtek, 17. maj 2007

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 :)

1.
17. maj 2007, 18:31

Super, hvala za tole ;) bo sigurno prišlo kdaj prav.

2.
jernej
30. julij 2008, 12:20

cestitam,dobra razlaga ;)