Quellenübergreifende Abfragen

Dank Tabellennormalisierung können wir Daten effektiv speichern. Wie schon erwähnt, sind aber Daten in Tabellen oft nicht gut lesbar. Das lösen wir jetzt über eine Abfrage: Über Tabelle anzeigenTabelle anzeigen fügen wir unsere Tabellen tblOrte und tblLänder zu einer Abfrage hinzu.

Abfrage1
tblLänder 1 tblOrte
* *
IDLand IDOrt
txtLand txtOrt
lngLand

Die Beziehung, die wir schon im Beziehungsfenster erstellt hatten, wird automatisch angezeigt. Falls wir einmal eine Abfrage erstellen wollen, bei der noch keine Beziehung vordefiniert ist, kann man sie hier genau wie im Beziehungsfenster definieren - aber natürlich gilt sie dann nur für die jeweilige Abfrage. Im unteren Teil des Abfragefensters nehmen wir folgende Einstellung vor:

Feld: txtOrt txtLand
Tabelle: tblOrte tblLänder
Sortierung:    
Anzeigen:
Kriterien:    
oder:    
     
SELECT txtOrt, txtLand
FROM tblLänder INNER JOIN tblOrte
     ON tblLänder.IDLand = tblOrte.lngLand;
Abfrage1
txtOrt txtLand
BerlinBerlin
HamburgHamburg
MünchenBayern
KölnNordrhein-Westfalen
FrankfurtHessen
StuttgartBaden-Württemberg
DüsseldorfNordrhein-Westfalen
DortmundNordrhein-Westfalen

Wir haben also Daten aus verschiedenen Tabellen verknüpft.

In den meisten Fällen sind die Beziehungen, wie sie aus dem Beziehungsfenster automatisch übernommen werden, vollkommen ausreichend. Gelegentlich will man aber doch andere Beziehungen. Wir haben in unserer Ortstabelle beispielsweise nicht alle real existierenden Orte eingegeben. Die Abfrage gibt nur Datensätze aus, für die sowohl in der Länder- als auch der Ortstabelle Werte zu finden sind. Um auch Länder zu sehen, für die noch gar keine Orte erfasst sind, müssen wir im oberen Teil des Entwurfsfensters per Doppelklick auf die Beziehung das Fenster Verknüpfungseigenschaften öffnen:

 Verknüpfungseigenschaften
Linker Tabellenname Rechter Tabellenname
Linker Spaltenname Rechter Spaltenname
1: Beinhaltet nur die Datensätze, bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind.
2: Beinhaltet ALLE Datensätze aus 'tblLänder' und nur die Datensätze aus 'tblOrte', bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind.
3: Beinhaltet ALLE Datensätze aus 'tblOrte' und nur die Datensätze aus 'tblLänder', bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind.

Wenn wir hier den zweiten Punkt „Beinhaltet ALLE Datensätze aus 'tblLänder' ...“ auswählen und das Fenster wieder schließen, wird die Beziehung im Entwurfsfenster mit einem Pfeil von links nach rechts hin zu tblOrte angezeigt. Das wird „Left Join“ genannt.

Abfrage1
tblLänder 1 tblOrte
* *
IDLand IDOrt
txtLand txtOrt
lngLand

Die Abfrage zeigt nun auch Bundesländer an, für die noch gar kein Ort eingegeben wurde.

SELECT txtOrt, txtLand
FROM tblLänder LEFT JOIN tblOrte
     ON tblLänder.IDLand = tblOrte.lngLand;
Abfrage1
txtOrttxtLand
BerlinBerlin
HamburgHamburg
MünchenBayern
KölnNordrhein-Westfalen
FrankfurtHessen
StuttgartBaden-Württemberg
DüsseldorfNordrhein-Westfalen
DortmundNordrhein-Westfalen
Brandenburg
Bremen
Mecklenburg-Vorpommern
Niedersachsen
Rheinland-Pfalz
Saarland
Sachsen
Sachsen-Anhalt
Schleswig-Holstein
Thüringen
SELECT txtOrt, txtLand
FROM tblLänder RIGHT JOIN tblOrte
     ON tblLänder.IDLand = tblOrte.lngLand;

Hätten wir im Verknüpfungsfenster den dritten Punkt „Beinhaltet ALLE Datensätze aus 'tblOrte' ...“ ausgewählt, würde der Pfeil im Entwurfsfenster von rechts nach links zeigen. Das wäre in unserem Beispiel sinnvoll, wenn wir auch Orte erfassen würden, die keinem Bundesland zugehören, also außerhalb Deutschlands liegen würden. Das wird „Right Join“ genannt.

SELECT txtOrt, txtLand
FROM tblOrte LEFT JOIN tblLänder
     ON tblOrte.lngLand = tblLänder.IDLand;

Natürlich könnte man dann im oberen Teil des Abfragefensters die beiden Tabellen so verschieben, so dass der Pfeil wieder von links nach rechts zeigt. Daher wird hier ausnahmsweise einmal auf die grafische Darstellung verzichtet und nur die SQL-Ansicht gezeigt. Der nebenstehenden SQL-Ausdruck ist zum vorhergehenden gleichwertig. Nun mag man sich fragen, wozu dann eigentlich „Right Join“ benötigt wird, wenn er sich auch zu einem „Left Join“ umformen lässt? Wenn man es aber in einer Abfrage mit vielen Tabellen und vielen Joins zu tun hat, wird es gelegentlich sinnvoll, sowohl Left als auch Right einzusetzen.