SQL: Nur den aktuellsten Eintrag aus einer gejointen Tabelle laden
Ich habe seit ein paar Monaten wieder verstärkt Gelegenheit, meine rostigen SQL-Kenntnisse aufzufrischen. Kürzlich bin ich dabei an einer kleinen Herausforderung vorbeigekommen, die mich doch ein paar Minuten mehr beschäftigt hat. Gegeben sind zwei Tabellen, Namen und Adressen.
Namen
ID | Name |
1 | Anna Amsel |
2 | Bernd Borstel |
3 | Cesar Causel |
4 | Dagmal Dack |
Adressen
ID | NameID | Adresse |
1 | 1 | Amselweg 2 |
2 | 2 | Badgasse 34 |
3 | 3 | Chausseeweg 123 |
4 | 3 | Dorfstraße 34 |
5 | 1 | Alabasterpfad 32 |
ID ist jeweils der Primary Key, NameID der Fremdschlüssel von Adressen auf Namen. Ziel der Übung ist es, alle Namen mit der (sofern vorhanden) aktuellsten Adresse abzufragen.
Ein inner join
bringt ganz klar das falsche Ergebnis, denn Dagmar Dack fehlt in der Ergebnismenge, Anna und Cesar sind zweimal vertreten.
SELECT n.Name, a.Adresse FROM Namen n JOIN Adressen a ON n.ID = a.NameID ; |
Ein left join
muss her, was das Ergebnis aber nur ein wenig besser macht: Dagmar ist jetzt drin, Anna und Cesar aber immer noch doppelt:
SELECT n.Name, a.Adresse FROM Namen n JOIN Adressen a ON n.ID = a.NameID ; |
Beholfen habe ich mir dann mit einem Subselect:
SELECT n.Name, a.Adresse FROM Namen n LEFT JOIN (SELECT MAX(ID) ID, MIN(NameID) NameID, MIN(Adresse) Adresse FROM Adressen GROUP BY NameID) a ON n.ID = a.NameID |
Ergebnis
Name | Adresse |
Anna Amsel | Alabasterpfad 32 |
Bernd Borstel | Badgasse 34 |
Cesar Causel | Chausseeweg 123 |
Dagmal Dack | NULL |