Die UNION Abfrage

Auswahlabfragen liefern normalerweise immer die Daten aus einer einzigen Tabelle oder aus mehreren miteinander verknüpften Tabellen. In letzterem Fall soll die Abfrage immer die Kombination der Daten von verknüpften Tabellen liefern. Gelegentlich sollen die Daten von zwei oder mehr Tabellen in einer Abfrage aber auf andere Art zusammengestellt werden. Nämlich so, dass die Datensätze dieser Tabellen jeweils als einzelne Datensätze erscheinen. So lassen sich dann beispielsweise Daten wie die Namen und Geburtsdaten von Personal und Kunden in einer Abfrage zusammenstellen und können als Geburtstagsliste dienen. Wie Sie UNION-Abfragen formulieren und was dabei zu beachten ist, zeigt dieser Beitrag.

Zusammenführen von Daten

Es gibt verschiedene Gründe für den Einsatz von UNION-Abfragen. Sie können diese nutzen, um die Daten verschiedener Tabellen wie der oben genannten Personal- und Kundentabelle zusammenzuführen, um daraus eine Liste der Geburtstage von Mitarbeitern und Kunden zu erstellen.

Oder Sie nutzen UNION-Abfragen, um das Ergebnis einer solchen Abfrage mit INSERT INTO in eine neue Tabelle zu transferieren. Diese Möglichkeit können Sie beispielsweise nutzen, um erst Daten aus externen Dateien wie etwa CSV-Dateien in jeweils eigene Tabellen zu importieren und diese dann per UNION-Abfrage zusammenzuführen.

Eine weitere Möglichkeit der Nutzung ist das Hinzufügen von Daten, die normalerweise nicht in einer Datenquelle vorkommen, aber dennoch angezeigt werden sollen – etwa, um die Liste der Einträge eines Kombinationsfeldes um Einträge wie <auswählen> </auswählen>oder zu ergänzen. Wie letzteres gelingt, schauen wir uns im Detail im Beitrag Kombinationsfeld mit Extraeinträgen an (www.access-im-unternehmen.de/1206).

Beispieldatenbank

Zu Beispielzwecken wollen wir davon ausgehen, dass wir die Artikellisten verschiedener Kategorien von verschiedenen Quellen beispielsweise im CSV-Format erhalten und diese dann zunächst über den Import der Textdateien in jeweils eine eigene Tabelle für jede Kategorie überführen.

Das Ergebnis sieht dann so aus, dass wir im Navigationsbereich sieben Tabellen mit verschiedenen Bezeichnungen wie tblArtikel_Fleischprodukte, tblArtikel_Getreideprodukte und so weiter vorfinden, die dann tatsächlich nur die Artikel der jeweiligen Kategorien enthalten. Der Einfachheit halber gehen wir davon aus, dass die Tabellen beim Import bereits in einer passenden Struktur vorliegen (siehe Bild 1).

Beispielmaterial: sieben Tabellen mit Artikeln unterschiedlicher Kategorien

Bild 1: Beispielmaterial: sieben Tabellen mit Artikeln unterschiedlicher Kategorien

Wir könnten die Tabellen nun auch mit mehreren INSERT INTO-Abfragen in eine Zieltabelle mit gleicher Struktur einfügen, aber in diesem Beitrag soll es sich ja um die Verwendung von UNION-Abfragen drehen.

Erstellen von UNION-Abfragen

Access ist deshalb so beliebt, weil es für fast alle Aufgaben eine grafische Benutzeroberfläche bietet. Aber auch nur für fast alle Aufgaben. UNION-Abfragen sind eine der wenigen Ausnahmen, denn diese können Sie nur in der sogenannten SQL-Ansicht definieren.

Das zieht nach sich, dass Sie zumindest über grundlegende SQL-Kenntnisse verfügen sollten. In unserem Fall reicht es aus, dass Sie den einfachsten Aufbau verstehen. Die notwendigen SQL-Teilabfragen, die wir später per UNION-Schlüsselwort verknüpfen wollen, können Sie allerdings auch über die Entwurfsansicht für Abfragen erstellen – jedoch müssen Sie dann in die SQL-Ansicht wechseln, um an den passenden SQL-Code heranzukommen. Für den Start erstellen Sie also zunächst eine neue, leere Abfrage. Dazu verwenden Sie den Ribbon-Eintrag Erstel-len|Ab-fra-gen|Abfrageentwurf. In die nun erscheinende Entwurfsansicht fügen wir per Doppelklick auf den Eintrag tblArtikel_Fleischprodukte die erste Tabelle ein (siehe Bild 2).

Hinzufügen einer Tabelle zum Abfrageentwurf

Bild 2: Hinzufügen einer Tabelle zum Abfrageentwurf

Dann schließen wir den Dialog Tabelle anzeigen und klicken doppelt auf das Sternchen (*) in der Feldliste der Tabelle tblArtikel_Fleischprodukte, um diesen Eintrag zum Entwurfsraster der Abfrage hinzuzufügen. Anschließend können Sie den Ribbon-Eintrag Ent-wurf|Er-gebnisse|Ansicht|SQL-An-sicht betätigen, um in die SQL-Ansicht der neu erstellten Abfrage zu wechseln (siehe Bild 3).

Wechsel zur SQL-Ansicht einer Abfrage

Bild 3: Wechsel zur SQL-Ansicht einer Abfrage

Damit erhalten Sie nun die SQL-Ansicht der Abfrage (siehe Bild 4) und gleichzeitig das Werkzeug für die folgenden Beispiele dieses Beitrags.

SQL-Ansicht einer Abfrage

Bild 4: SQL-Ansicht einer Abfrage

Wenn Sie nun den Ribbon-Befehl Entwurf|Ergeb-nis-se|An-sicht|Da-ten-blatt betätigen, erhalten Sie das Ergebnis der Abfrage mit allen Datensätzen der Tabelle tblArtikel_Fleischprodukte.

UNION-Abfragen einsetzen

Damit naht der Auftritt des UNION-Schlüsselworts: Wir wollen nun nicht mehr nur die Daten der Tabelle tblArtikel_Fleischprodukte ausgeben, sondern auch noch die Einträge der Tabelle tblArtikel_Getreideprodukte hinzufügen. Dazu erweitern wir die Abfrage nun wie folgt:

SELECT tblArtikel_Fleischprodukte.*
FROM tblArtikel_Fleischprodukte
UNION
SELECT tblArtikel_Getreideprodukte.*
FROM tblArtikel_Getreideprodukte;

Wir fügen also eine weitere, genau gleich aufgebaute SELECT-Abfrage hinzu, die lediglich die Daten einer anderen Tabelle liefert, und verknüpfen die beiden Abfragen mit dem UNION-Schlüsselwort (die erste SELECT-Abfrage darf dabei nicht mehr mit dem Semikolon abschlossen werden).

Wenn Sie nun in die Datenblattansicht wechseln, erhalten Sie das Ergebnis aus Bild 5. Eine Besonderheit bei diesem Abfrageergebnis ist, dass die in den ursprünglichen Tabellen als Nachschlagefelder ausgelegten Felder LieferantID und KategorieID nun nicht mehr als solche dargestellt werden, sondern nur noch die tatsächlichen Feldwerte anzeigen. Die Abfrage können Sie auch noch ein wenig vereinfacht darstellen:

Ergebnis einer UNION-Abfrage

Bild 5: Ergebnis einer UNION-Abfrage

SELECT * FROM tblArtikel_Fleischprodukte
UNION
SELECT * FROM tblArtikel_Getreideprodukte;

Speichern der UNION-Abfrage

Schließlich speichern wir die UNION-Abfrage, beispielsweise über die Tastenkombination Strg + S, unter dem Namen qryArtikel_Fleisch_Getreide.

Ein Blick in den Navigationsbereich zeigt, dass Access für UNION-Abfragen ein eigenes Symbol vorsieht, nämlich das Schnittmengensymbol (siehe Bild 6).

Eine UNION-Abfrage im Navigationsbereich

Bild 6: Eine UNION-Abfrage im Navigationsbereich

UNION-Abfrage als Unterabfrage

Wenn Sie die UNION-Abfrage nicht mit diesem Symbol anzeigen lassen wollen, verwenden Sie den gesamten Abfrageausdruck als Unterabfrage einer weiteren SELECT-Abfrage:

SELECT * FROM (
     SELECT * FROM tblArtikel_Fleischprodukte
     UNION 
     SELECT * FROM tblArtikel_Getreideprodukte);

Diese Abfrage liefert genau das gleiche Ergebnis, wird aber mit dem Symbol einer herkömmlichen Auswahlabfrage im Navigationsbereich dargestellt.

Diese Abfrage können wir nun auch in der Entwurfsansicht öffnen. Das Ergebnis ist sehr interessant – siehe Bild 7.

Eine in eine SELECT-Abfrage eingefasste UNION-Abfrage in der Entwurfsansicht

Bild 7: Eine in eine SELECT-Abfrage eingefasste UNION-Abfrage in der Entwurfsansicht

Die hier verwendete Bezeichnung der Unterabfrage, nämlich %$##@_Alias, können Sie noch ersetzen. Dazu definieren Sie mit dem AS-Schlüsselwort einen anderen Namen für die Unterabfrage:

SELECT * FROM (
     SELECT * FROM tblArtikel_Fleischprodukte
     UNION 
     SELECT * FROM tblArtikel_Getreideprodukte)
As tblArtikelUNION;

Direkt in die SQL-Ansicht

Im ersten Beispiel haben wir erst eine einfache SELECT-Abfrage auf Basis einer Tabelle erstellt. Dann haben Sie die SQL-Ansicht angezeigt, um den SQL-Code zu erweitern.

Wenn Sie schneller zur SQL-Ansicht wechseln wollen, ohne vorher noch den Entwurf der Tabelle zu bearbeiten, gelingt das mit diesen Schritten:

  • Erstellen Sie eine neue, leere Abfrage mit dem entsprechenden Ribbon-Eintrag.
  • Betätigen Sie die Escape-Taste, um den Dialog Tabelle anzeigen zu schließen.
  • Betätigen Sie dann den Ribbon-Befehl Entwurf|Ergebnisse|SQL-Ansicht. Wenn der Tabellenentwurf zu diesem Zeitpunkt leer ist, wird die SQL-Ansicht also direkt als Schaltfläche angeboten und nicht mehr die Datenblattansicht.

Mehr als zwei Tabellen per UNION-Abfrage vereinen

Sie können direkt auch mehrere Tabellen oder Abfragen in einer UNION-Abfrage zusammenführen. Dazu brauchen Sie einfach nur weitere UNION-Schlüsselwörter mit den jeweiligen SELECT-Anweisungen an die bestehende Abfrage anzuhängen.

Wenn Sie die Tabellen mit den Artikeln aller acht Kategorien zusammenführen wollen, benötigen Sie die folgende Abfrage:

SELECT * FROM tblArtikel_Fleischprodukte
UNION
SELECT * FROM tblArtikel_Getraenke
UNION
SELECT * FROM tblArtikel_Getreideprodukte
UNION
SELECT * FROM tblArtikel_Gewuerze
UNION
SELECT * FROM tblArtikel_Meeresfruechte
UNION
SELECT * FROM tblArtikel_Milchprodukte
UNION
SELECT * FROM tblArtikel_Naturprodukte
UNION
SELECT * FROM tblArtikel_Suesswaren

Schauen wir uns das Ergebnis an, erhalten wir die 77 Artikel, die auch die Tabelle tblArtikel enthalten hat, die wir als Grundlage für die hier verwendeten Tabellen genutzt haben.

Maximale Anzahl der Tabellen pro UNION-Abfrage

Im vorherigen Beispiel haben wir bereits acht Tabellen per UNION-Abfrage verknüpft. Was aber ist überhaupt die maximale Anzahl von UNION-Abschnitten in einer solchen Abfrage Wir haben das experimentell ermittelt und sind auf eine Anzahl von 50 Tabellen beziehungsweise 49 UNION-Schlüsselwörtern gekommen. Bei der 51. Tabelle ist dann beim Versuch, in die Datenblattansicht zu wechseln, die Fehlermeldung aus Bild 8 erschienen. Das heißt, dass 50 per UNION verknüpfte Datenquellen wohl die Obergrenze darstellen. Und wenn Sie Access hier überlisten wollen, indem Sie zwei Abfragen erstellen, die jeweils 50 Abfrage mit UNION verknüpfen, und diese wiederum per UNION verknüpfen wollen, haben Sie keinen Erfolg:

Zu viele UNION-Abschnitte

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar