SQL Constraint mit NULL Werten

efcoyote

Lt. Junior Grade
Registriert
Juni 2007
Beiträge
278
Folgendes Problem. Eine Tabelle "Mensch" mit diversen Feldern (siehe Anhang). Darunter auch 2 Fremdschlüssel (stadt, land). Jedoch können diese auch NULL sein, falls keine stadt bzw land zu geordnet ist.

Ich möchte ein Query, das alle Spalten der Tabelle "Mensch" und der Fremdtabellen zurückgibt, falls die IDs bei Mensch eingetragen sind.

1. Ansatz - Subquery
Code:
SELECT (SELECT s.stadtname FROM städte s WHERE s.id = m.stadt) FROM mensch m
Problem: Man kann damit nur eine Spalte (stadtname) zurückliefern und nicht mehrere.

2. Ansatz - Join
Code:
SELECT s.stadtname, s.bundesland, l.einwohner FROM mensch m LEFT JOIN städte s ON s.id = m.stadt LEFT JOIN länder l ON l.id = m.land
Problem: Falls bei stadt NULL steht wird das land im 2. JOIN nicht mehr beachtet.


Mir will einfach keine Möglichkeit einfallen, das Problem in ein Query zu packen. Vielleicht ist es auch ganz einfach und ich habe gerade ein Brett vorm Kopf.
 

Anhänge

  • db.png
    db.png
    4,5 KB · Aufrufe: 171
Zuletzt bearbeitet: (genauer formuliert, was ich möchte)
Also du willst eigentlich die Angaben des Menschen und DESSEN Stadtnamen, Landname, Einwohner etc haben?

Icn nehme mal an die Entität land und stadt bei Mensch sind FKs dann sollte man das vielleicht im Datenmodell auch noch anmerken ;). Dann wär's klar :D.
 
Ja, alles aus "Mensch" und das aus den Fremdtabellen (Länder, Städte).
Das land und stadt bei "Mensch" FK sind hab ich oben schon geschrieben. Die kleine Grafik dient nur der Veranschaulichung des Problems. Meine eigentliche Datenbank ist etwas komplexer.
 
Trotzdem sollte es in den Spaltennamen vermerkt werden ;). mit stadt_fk z.B.

Nun ja der SELECT ist ziemlich simpel wenn ich's richtig verstanden hab... keine Nested Tables, keine Sub Selects einfach JOINS

Code:
SELECT m.id menschid
      ,name
      ,s.id stadtid
      ,stadtname
      ,bundesland
      ,l.id landid
      ,landname
      ,einwohner
FROM mensch m
LEFT JOIN städte s ON m.stadt = s.id
LEFT JOIN länder l ON m.land = l.id

Städte und Länder sind nicht erlaubt als Tabellennamen. Diese sind IMMER in der Einzahl sprich: Stadt, Land
 
Zuletzt bearbeitet:
Ah! Das Wichtigste hab ich vergessen LEFT JOIN *drsshh* naja, korrigiert.
 
Wie ich oben schon erwähnt habe, funktioniert das nicht. Wenn m.stadt NULL ist wird das 2. LEFT JOIN nicht ausgeführt. Das habe ich alles schon ausprobiert und auch im ersten Post geschrieben. Und das mit den Umlauten im Tabellennamen weiß ich, es ist nur ein Beispiel zur Verdeutlichung. Es geht eher um das Problem als die Namen.
 
Zuletzt bearbeitet:
Das kann ich mir nicht vorstellen. Was soll das für eine Datenbank sein? Du könntest mal explizit "Left outer join" schreiben aber normal sollte das auch keinen Unterschied machen.
 
Der zweite Query muss tatsächlich so funktionieren...
Einziges Problem könnte noch sein, dass du keine Spalte aus mensch selektierst, das darf aber eigentlich nicht zu einem Problem führen!
Falls du das ganze in Access ausprobierst, musst du wahrscheinlich noch die Joins von innen nach aussen einklammern. Irgendwie sowas erinnere ich noch von damals...
 
Ist wirklich seltsam dass das nicht funktioniert, obwohl es das eigentlich sollte.

Als Tipp für dein ERD, ich würde Mensch nicht von Land und Stadt abhängig machen sondern nur von Stadt. Weil jede Stadt ist auch in einem Land.
 
Ich hab das jetzt nochmal an einem kürzerem Query bei meiner eigentlichen Datenbank getestet und jetzt klappt es mit dem LEFT JOIN. In das ursprüngliche längere Query hat sich wahrscheinlich irgendwo ein Fehler eingeschlichen. Danke noch mal für die Behaarlichkeit das die 2. Variante funktionieren muss.

PS: In meiner eigentlichen Datenbank geht es weder um Menschen noch Städte und auch um keine ERDs.
 
Entity-Relationship-Diagramm, allerdings hat die Skizze mit einem klassischen ERD recht wenig damit gemein und diente wie schon gesagt nur der Veranschaulichung eines Beispiels. Ich wollte nicht erst etwas mit Paint malen.
 
Ja dann hast du mich missverstanden. Ich weiss dass das da oben kein ERD ist, aber ich hab jetzt den allgemeinen Aufbau so bezeichnet.

Hätte auch Datenbank oder sonst was sagen können, naja sorry... Außerdem kann ich ja nicht wissen dass das nur ein Beispiel ist oder nicht, soll ja nur als Tipp gedacht gewesen sein.
 
Zurück
Oben