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

3.
26. februar 2021, 00:37

Lithuanian Litas

4.
1. marec 2021, 21:45

Sweden

5.
8. marec 2021, 21:13

Developer

6.
16. marec 2021, 21:14

neural

7.
23. marec 2021, 19:51

magenta

8.
3. april 2021, 23:38

compelling

9.
22. april 2021, 01:20

Administrator

10.
23. april 2021, 19:37

compressing

11.
12. maj 2021, 04:15

Concrete

12.
14. maj 2021, 08:46

Division

13.
8. junij 2021, 11:05

strategic

14.
9. junij 2021, 05:10

magnetic

15.
24. junij 2021, 20:28

regional

16.
1. julij 2021, 07:35

Terrace

17.
13. julij 2021, 21:26

synthesize