Zur Startseite Folgendes Problem taucht immer wieder auf:
Zwei Tabellen sind prinzipiell durch ein Feld miteinander verbunden. Beispiel:
Adresse und Telefonnummer
Das ist immer dann sinnvoll, wenn zu einer Adresse mehrere Telefonnummern gehören können, beispielsweise wenn mehrere Durchwahlen zu einer Person möglich sind, oder eine zweite (Handy-)Nummer zur gleichen Adresse gespeichert werden soll.
Ein passender SQL-Dump zum Nachvollziehen des hier gezeigten Beispiels können Sie hier herunterladen.
Die Abfrage einer solchen Tabelle erfolgt dann üblicherweise mit einer normalen WHERE-Klausel:
select * from adressen, telefon where adressen.id = telefon.adr_id
In diesem Fall werden alle Adressen angezeigt, bei denen auch eine Telefonnummer gespeichert wurde. Der zugehörige Fremdschlüssel ist hier "telefon.adr_id".
Was ist jedoch, wenn (noch) nicht zu jeder Adresse eine Telefonnummer gespeichert wurde? Die obige Abfrage zeigt nicht die Adressen an, bei denen keine Telefonnummer existiert. In diesem Fall hilft eine Abfrage mit LEFT JOIN:
select * from adressen left join telefon on adressen.id = telefon.adr_id
Es werden nun alle Adressen angezeigt, auch wenn keine Telefonnummer in der Tabelle "telefon" vorhanden ist. Die Adressen ohne Telefonnummer enthalten im Ergebnis die Telefon-Felder ohne Inhalt (genauer: mit Inhalt NULL).
Möchte ich jetzt aber nur die Adressen erfahren, zu denen noch keine Telefonnummer gespeichert wurde, kann man sich dieses Ergebnis zu Nutze machen:
select * from adressen left join telefon on adressen.id = telefon.adr_id where isnull(telnum)
Der Trick ist recht einfach: Formulieren Sie für das Ergebnis eine WHERE-Klausel, bei dem sie auf isnull() abfragen. Das abgefragte Feld (hier: telnum) muss nur irgendein Feld sein, dass in der Telefon-Tabelle vorkommt und in der Feldliste der Abfrage steht.
In einer sauberen Abfrage sollten natürlich nur die Felder in der Feldliste stehen, die für das Ergebnis wirklich benötigt werden. Daher hier noch mal eine entsprechende Variante der letzten Abfrage:
select a.name, a.vorname, t.telnum from adressen a left join telefon t on a.id = t.adr_id where isnull(telnum)
Hinweis: Diesen Text und die enthaltenen Beispielprogramme und Skripte dürfen Sie zum Erlernen der einzelnen Techniken und auch als Grundlage für Ihre eigenen Projekte auf eigene Gefahr kostenlos nutzen.
Bitte denken Sie daran, dass alle Texte und Quellcodes trotzdem urheberrechtlich geschützt sind. Eine direkte Weitergabe ist nur nach ausdrücklicher schriftlicher Genehmigung gestattet.