Ich stehe völlig auf dem Schlauch weshalb ein LEFT JOIN in Internet-Beispielen so funktioniert wie er soll, mit meinen Test-Daten allerdings nicht. Ich versuche es so kurz wie möglich zu machen.
Das sind meine zwei Mini-Tabellen:
Code:
CREATE TABLE items (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
someValue INTEGER
);
CREATE TABLE descriptions(
id INTEGER NOT NULL,
lang TEXT NOT NULL,
description TEXT,
CONSTRAINT descriptions_pk PRIMARY KEY (id, lang),
CONSTRAINT descriptions_FK FOREIGN KEY(id) REFERENCES items(id) ON DELETE CASCADE
);
Jetzt füllen wir sie noch mit ganz wenigen Daten:
Code:
INSERT INTO items VALUES
(NULL, 42),
(NULL, 4711),
(NULL, 1234);
INSERT INTO descriptions VALUES
(1, "DEU", "Die Antwort auf alles"),
(1, "ENG", "The answer to everything"),
(2, "DEU", "Eine gewöhnliche Zahl"),
-- (2, "ENG", "An ordinary number"),
(3, "DEU", "Einfach zu tippen"),
(3, "ENG", "Easy to type");
Wir sehen hier, dass ich für "item 2" die Sprache "ENG" weggelassen habe:
Jetzt hätte ich doch gedacht, dass ich mit einem
LEFT OUTER JOIN eine Trefferliste eine evtl. fehlende Sprache mit NULL aufgefüllt wird.
Code:
SELECT * FROM items LEFT OUTER JOIN descriptions USING(id);
Ergebnis:
id | someValue | lang | description |
1 | 42 | DEU | Die Antwort auf alles |
1 | 42 | ENG | The answer to everything |
2 | 4711 | DEU | Eine gewöhnliche Zahl |
3 | 1234 | DEU | Einfach zu tippen |
3 | 1234 | ENG | Easy to type |
Ich hätte noch eine Weitere Zeile mit
id | someValue | lang | description |
2 | 4711 | NULL | NULL |
oder so erwartet.
So macht es keinen Unterschied, ob ich einfach nur
JOIN oder
LEFT (OUTER) JOIN sage.
Was mache ich anders als das Beispiel unter
https://www.w3resource.com/sqlite/sqlite-left-join.php?
Wenn ich das Beispiel bei mir nachstelle funktioniert es auch! Der einzige Unterschied ist vielleicht mein
zusammengesetzter Primärschlüssel (id, lang) in "descriptions"?