Quellenübergreifende Abfragen

Dank der Tabellennormalisierung können wir Daten effektiv speichern. Wie bereits erwähnt, sind solche Rohdaten jedoch für Menschen nicht immer ohne weiteres verständlich. Dieses Problem lösen wir mit Abfragen: Über Tabelle anzeigenTabellen hinzufügen fügen wir einer Abfrage unsere Tabellen tblOrte und tblLänder hinzu.

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

Die Beziehung, die wir bereits im Beziehungsfenster erstellt hatten, wird hier automatisch angezeigt. Im unteren Teil des Abfragefensters nehmen wir nun folgende Einstellung vor:

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

Wir haben also Daten aus verschiedenen Tabellen miteinander verbunden.

In den meisten Fällen entsprechen die Beziehungen, wie sie automatisch aus dem Beziehungsfenster übernommen werden, genau dem, was wir für die Abfrage wollen. Falls wir doch einmal eine Abfrage erstellen wollen, für die noch keine Beziehung vordefiniert ist, oder für die wir eine andere Beziehung wünschen, kann man sie hier genauso definieren wie im Beziehungsfenster - natürlich gilt das dann nur für die betreffende Abfrage. Aber manchmal passen die vorhandenen Beziehungen doch nicht perfekt für die gewünschte Abfrage. Wir haben in unserer Ortstabelle beispielsweise nicht alle real existierenden Orte eingetragen. Die Abfrage gibt nur Datensätze aus, für die sowohl in der Länder- als auch der Ortstabelle Werte gefunden werden können. Um auch die 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 gar kein Ort eingegeben wurde.

SELECT txtOrt, txtLand
FROM tblLänder LEFT JOIN tblOrte
     ON tblLänder.IDLand = tblOrte.lngLand;
Abfrage1
txtOrttxtLand
StuttgartBaden-Württemberg
MünchenBayern
BerlinBerlin
Brandenburg
Bremen
HamburgHamburg
FrankfurtHessen
Mecklenburg-Vorpommern
Niedersachsen
KölnNordrhein-Westfalen
DüsseldorfNordrhein-Westfalen
DortmundNordrhein-Westfalen
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 zu keinem Bundesland gehö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 die beiden Tabellen im oberen Teil des Abfragefensters 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 nebenstehende SQL-Ausdruck ist zum äqivalent zum vorherigen. Nun mag man sich fragen, wozu man eigentlich einen „Right Join“ braucht, wenn man ihn auch zu einem „Left Join“ umformen kann? Aber wenn man es in einer Abfrage mit vielen Tabellen und vielen Joins zu tun hat, ist es gelegentlich sinnvoll, Left Join und Right Join zu kombinieren.