[Tutorial] Full Outer Join - Workaround für DBMS, welche das nicht unterstützen

Zvoni

Erfahrenes Mitglied
Mahlzeit.
Bin letztens auf den Umstand gestossen, dass es (populäre) DBMS gibt, welche out-of-the-box keinen Full Outer Join unterstützen.
namentlich zu erwähnen sind SQLite und MySQL.

Also habe ich mir einen Workaround erarbeitet (Beispiel-Code ist für SQLite)
SQL:
CREATE TABLE "tbl_left" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "ValueLeft"    TEXT,
    PRIMARY KEY("ID" AUTOINCREMENT)
);
CREATE TABLE "tbl_right" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "ValueRight"    TEXT,
    PRIMARY KEY("ID" AUTOINCREMENT)
);
/*Testdaten für beide Tabellen*/
INSERT INTO tbl_right VALUES (2,'test 2'),(3,'test 3'),(4,'test 4'),(5,'test 5'),(7,'test 7'),(8,'test 8'),(10,'test 10');
INSERT INTO tbl_left VALUES (1,'test 1'),(2,'test 2'),(4,'test 4'),(5,'test 5'),(6,'test 6'),(8,'test 8'),(9,'test 9'),(10,'test 10')
Hier der Workaround für den FULL OUTER JOIN. Der Trick ist einen DISTINCT UNION auf beide beteiligte Tabellen zu erstellen, welche man als "Master" benutzt, an welche man zwei LEFT JOIN's hängt
SQL:
SELECT l2.ID As LeftID, l2.ValueLeft, r2.ID AS RightID, r2.ValueRight FROM 
(SELECT DISTINCT l.ID As ID  FROM tbl_left As l UNION SELECT r.ID AS ID FROM tbl_right As r) As C
LEFT JOIN tbl_left as l2 ON C.ID=l2.ID 
LEFT JOIN tbl_right As r2 ON r2.ID=C.ID 
ORDER BY c.ID
Ergibt:

LeftIDValueLeftRightIDValueRight
1test 1
2test 22test 2
3test 3
4test 44test 4
5test 55test 5
6test 6
7test 7
8test 88test 8
9test 9
10test 1010test 10
 
Zurück