![]() |
Datenbank: Sqlite • Version: 3 • Zugriff über: FireDAC
Verständnisfrage zu LEFT JOIN
Liste der Anhänge anzeigen (Anzahl: 3)
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: Anhang 54107
Code:
Jetzt füllen wir sie noch mit ganz wenigen Daten:
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 );
Code:
Wir sehen hier, dass ich für "item 2" die Sprache "ENG" weggelassen habe:
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"); Anhang 54108 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:
Ergebnis:
SELECT * FROM items LEFT OUTER JOIN descriptions USING(id);
Ich hätte noch eine Weitere Zeile mit
So macht es keinen Unterschied, ob ich einfach nur JOIN oder LEFT (OUTER) JOIN sage. Was mache ich anders als das Beispiel unter ![]() Anhang 54109 Wenn ich das Beispiel bei mir nachstelle funktioniert es auch! Der einzige Unterschied ist vielleicht mein zusammengesetzter Primärschlüssel (id, lang) in "descriptions"? |
AW: Verständnisfrage zu LEFT JOIN
Wenn du immer eine vollständige Liste der Sprachen haben willst, brauchst du erstmal eine Tabelle mit allen Sprachen im Feld lang, auf der du dann den LEFT JOIN loslassen kannst. Woher sollte das System denn auch sonst wissen, welche Sprachen vorkommen können.
SQL-Code:
SELECT * FROM items
LEFT JOIN language USING(lang); LEFT JOIN descriptions USING(id); |
AW: Verständnisfrage zu LEFT JOIN
Nein, ich wollte keine Übersicht über "alles", sondern in der Query natürlich noch nach Sprache filtern.
Wenn beispielsweise für die Sprache "ENG" kein Text vorliegt, hätte ich in der Ergebnismenge gerne NULL in der Spalte "description" gehabt. Aktuell muss ich für jedes item in der Tabelle descriptions einen Eintrag für jede Sprache anlegen und das Feld description auf NULL setzen. Ich hätte gedacht dass man da drum herum kommt? |
AW: Verständnisfrage zu LEFT JOIN
Wie schon gesagt:
Zitat:
Der LEFT JOIN zwischen items und descriptions bedeutet doch nur: Gib mir alle Einträge aus items und füge die passenden Felder aus descriptions dazu, wenn es welche gibt. |
AW: Verständnisfrage zu LEFT JOIN
Vielen Dank, durch deine Beharrlich hast du mich glaube ich auf die richtige Spur gebracht.
Ja, ich brauche definitv eine Tabelle mit allen Sprachen drin. Vielleicht kann man das auch mit einer Query realisieren ("Select distinct" oder sowas). Ich denke die vollständige Query ist
Code:
Damit erhalte ich was ich brauche:
SELECT * FROM items CROSS JOIN language
LEFT JOIN descriptions USING(lang, id)
Im letzten Schritt kann ich das dann natürlich noch mit einem WHERE filtern, für die Sprache die ich brauche. Dankesehr. |
AW: Verständnisfrage zu LEFT JOIN
|
AW: Verständnisfrage zu LEFT JOIN
Ich hatte einen harten Tag, hilf mir nochmal 😫
Was wolltest du mit der 3NF sagen? Die ist doch gegeben? Ich hätte gesagt 2NF ist sie, denn "description" ist definitiv vom gesamten Primärschlüssel abhängig. 3NF ist auch gegeben, denn von Nicht-Schlüssel-Gedöns (items.someValue und descriptions.description) ist gar nichts abhängig. |
AW: Verständnisfrage zu LEFT JOIN
Ohne die Language-Tabelle war die 3.NF eben nicht gegeben.
|
AW: Verständnisfrage zu LEFT JOIN
Für eine konkrete Sprache sollte die Abfrage auch ohne die 3.Tabelle funktionieren:
Code:
Ob der Syntax für diese SQL-Datenbank passt, weis ich allerdings nicht.
SELECT *
FROM items a LEFT JOIN descriptions b on (b.id = a.id) and (b.lang = :lang) WHERE (b.id is null) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz