Kombinieren mehrerer Abfragen in einem einzigen Ergebnis mithilfe einer Union-Abfrage

Gilt für
Access für Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

Manchmal möchten Sie Datensätze aus einer Tabelle oder Abfrage mit Datensätzen aus einer oder mehreren anderen Tabellen zu einem einzigen Ergebnis kombinieren. Dies ist die Funktion einer Union-Abfrage in Access.

Um Union-Abfragen effektiv zu verstehen, sollten Sie sich zuerst mit dem Entwerfen von einfachen Auswahlabfragen in Access vertraut machen. Wenn Sie mehr zum Entwerfen von Auswahlabfragen erfahren möchten, lesen Sie Erstellen einer einfachen Auswahlabfrage.

Untersuchung eines Arbeitsbeispiels für eine Union-Abfrage

Wenn Sie noch nie eine Union-Abfrage erstellt haben, kann es hilfreich sein, zuerst ein funktionierendes Beispiel in der Northwind Access-Vorlage zu untersuchen. Sie können auf der Seite "Erste Schritte" von Access nach der "Northwind"-Beispielvorlage suchen, indem Sie "NeueDatei>" auswählen. Sie können auch eine Kopie direkt von der Northwind-Beispielvorlage herunterladen.

Schließen Sie nach dem Öffnen der Northwind-Datenbank durch Access das zuerst angezeigte Anmeldedialogfeld, und erweitern Sie dann den Navigationsbereich. Klicken Sie oben im Navigationsbereich auf die Schaltfläche und dann auf Objekttyp , um alle Datenbankobjekte nach Typ zu organisieren. Erweitern Sie als Nächstes die Gruppe "Abfragen ", und Sie sehen eine Abfrage namens "Produkttransaktionen".

Union-Abfragen lassen sich von anderen Abfrageobjekten problemlos unterscheiden. Sie weisen nämlich ein besonderes Symbol auf, das zwei ineinander greifenden Kreisen ähnelt, die eine vereinigte Gruppe aus zwei Gruppen darstellen:

Screenshot eines Vereinigungsabfragesymbols in Access. Im Gegensatz zu normalen Auswahl- und Aktionsabfragen sind Tabellen in einer Union-Abfrage nicht verknüpft. Das bedeutet, dass Sie den Access-Grafikabfrage-Designer nicht zum Erstellen oder Bearbeiten von Union-Abfragen verwenden können. Wenn Sie eine Union-Abfrage im Navigationsbereich öffnen, wird sie von Access geöffnet und zeigt die Ergebnisse in der Datenblattansicht an. Beachten Sie, dass die Entwurfsansicht unter Ansichten auf der Registerkarte Start nicht verfügbar ist, wenn Sie mit Vereinigungsabfragen arbeiten. Sie können nur zwischen der Datenblattansicht und der SQL-Ansicht wechseln.

Um das Studium dieses Beispiels für eine Union-Abfrage fortzusetzen, klicken Sie aufStartansichten>>SQL-Ansicht, um die Syntax anzuzeigen, die SQL sie definiert. In dieser Abbildung haben wir einige zusätzliche Abstände hinzugefügt SQL , damit Sie die verschiedenen Teile, aus denen eine Union-Abfrage besteht, leicht erkennen können.

Sehen wir uns die SQL Syntax dieser Union-Abfrage aus der Northwind-Datenbank im Detail an:


SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Der erste und dritte Teil dieser SQL-Anweisung besteht im Wesentlichen aus zwei Auswahlabfragen. Diese Abfragen rufen zwei verschiedene Gruppen von Datensätzen ab – eine aus der Tabelle Produktbestellungen und eine aus der Tabelle Produktkäufe.

Der zweite Teil dieser SQL Anweisung ist das UNION Schlüsselwort (keyword), das Access anweist, diese beiden Datensätze zu kombinieren.

Der letzte Teil dieser SQL Anweisung bestimmt die Reihenfolge der kombinierten Datensätze mithilfe einer ORDER BY Anweisung. In diesem Beispiel sortiert Access alle Datensätze nach dem Feld "Bestelldatum" in absteigender Reihenfolge.

Hinweis

Union-Abfragen sind in Access immer schreibgeschützt; Sie können in der Datenblattansicht keine Werte ändern.

Erstellen einer Union-Abfrage durch Erstellen und Kombinieren von Auswahlabfragen

Obwohl Sie eine Union-Abfrage erstellen können, indem Sie die SQL Syntax direkt in der SQL-Ansicht schreiben, ist es möglicherweise einfacher, sie in Teilen mit ausgewählten Abfragen zu erstellen. Anschließend können Sie die SQL-Teile kopieren und in eine kombinierte Union-Abfrage einfügen.

Wenn Sie das Lesen der Schritte überspringen und sich stattdessen ein Beispiel anschauen möchten, lesen Sie den nächsten Abschnitt Anschauen eines Beispiels für das Erstellen einer Union-Abfrage.

  1. Klicken Sie auf der Registerkarte Erstellen in der Gruppe Abfragen auf Abfrageentwurf.
  2. Doppelklicken Sie auf die Tabelle mit den Feldern, die Sie einbeziehen möchten. Die Tabelle wird dem Abfrageentwurfsfenster hinzugefügt.
  3. Doppelklicken Sie im Abfrageentwurfsfenster auf jedes Feld, das Sie einschließen möchten. Während Sie Felder auswählen, achten Sie darauf, dass Sie dieselbe Anzahl von Feldern in derselben Reihenfolge hinzufügen, in der Sie sie in den anderen Auswahlabfragen hinzufügen. Achten Sie besonders auf die Datentypen der Felder, und stellen Sie sicher, dass die Datentypen mit Feldern kompatibel sind, die sich in anderen zu kombinierenden Abfragen an derselben Position befinden. Wenn beispielsweise Ihre erste Auswahlabfrage fünf Felder aufweist, von denen das erste Feld Daten für Datum/Uhrzeit enthält, stellen Sie sicher, dass jede der anderen zu kombinierenden Auswahlabfragen ebenfalls fünf Felder aufweist, das erste Feld Daten für Datum/Uhrzeit enthält usw.
  4. Optional können Sie Ihren Feldern Kriterien hinzufügen, indem Sie die entsprechenden Ausdrücke in der Zeile "Kriterien" des Feldrasters eingeben.
  5. Nachdem Sie alle Felder und Feldkriterien hinzugefügt haben, sollten Sie die Auswahlabfrage ausführen und deren Ausgabe prüfen. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen.
  6. Schalten Sie in die Entwurfsansicht der Abfrage um.
  7. Speichern Sie die Auswahlabfrage, und lassen Sie sie geöffnet.
  8. Wiederholen Sie dieses Verfahren für jede der Auswahlabfragen, die Sie kombinieren möchten.

Nachdem Sie Ihre ausgewählten Abfragen erstellt haben, ist es an der Zeit, sie zu kombinieren. In diesem Schritt erstellen Sie die Union-Abfrage, indem Sie die SQL Anweisungen kopieren und einfügen.

  1. Klicken Sie auf der Registerkarte Erstellen in der Gruppe Abfragen auf Abfrageentwurf.
  2. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Abfrage auf Union. Access blendet das Abfrageentwurfsfenster aus und zeigt die Registerkarte SQL-View-Objekt an. An diesem Punkt ist die Registerkarte leer.
  3. Klicken Sie auf die Registerkarte für die erste Auswahlabfrage, die Sie in der Union-Abfrage kombinieren möchten.
  4. Klicken Sie auf der Registerkarte Start aufSQL-Ansichtanzeigen>.
  5. Kopieren Sie die SQL Anweisung für die Auswahlabfrage. Klicken Sie auf die Registerkarte für die Union-Abfrage, mit deren Erstellung Sie weiter oben begonnen haben.
  6. Fügen Sie die SQL Anweisung für die Auswahlabfrage in die SQL-View-Objektregisterkarte der Union-Abfrage ein.
  7. Löschen Sie das Semikolon (;) am Ende der SELECT-Abfrageanweisung SQL .
  8. Drücken Sie die EINGABETASTE, um den Cursor um eine Zeile nach unten zu bewegen, und geben Sie dann Text UNION in die neue Zeile ein.
  9. Klicken Sie für die nächste Auswahlabfrage, die Sie mit der Union-Abfrage kombinieren möchten, auf die Registerkarte.
  10. Wiederholen Sie die Schritte 5 bis 10, bis Sie alle SQL Anweisungen für die Auswahlabfragen kopiert und in das SQL-Ansichtsfenster der Union-Abfrage eingefügt haben. Löschen Sie nach der SQL Anweisung für die letzte Auswahlabfrage weder das Semikolon noch geben Sie etwas ein.
  11. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen.

Die Ergebnisse Ihrer UNION-Abfrage werden in der Datenblattansicht angezeigt.

Anschauen eines Beispiels für das Erstellen einer Union-Abfrage

Hier ist ein Beispiel, das Sie in der Northwind-Beispieldatenbank nachstellen können. Diese Union-Abfrage sammelt die Namen von Personen aus der Tabelle Kunden und kombiniert sie mit den Namen von Personen aus der Tabelle Lieferanten. Wenn Sie das nachvollziehen möchten, arbeiten Sie diese Schritte in Ihrer Kopie der Northwind-Beispieldatenbank durch.

Hier sind die erforderlichen Schritte zum Erstellen dieses Beispiels:

  1. Erstellen Sie zwei Auswahlabfragen namens "Abfrage1" und "Abfrage2" mit den Tabellen "Kunden" und "Lieferanten" als Datenquellen. Verwenden Sie die Felder "Vorname" und "Nachname" als Anzeigewerte.

  2. Erstellen Sie eine neue Abfrage namens "Abfrage3" – zunächst ohne Datenquelle. Klicken Sie dann auf der Registerkarte Entwurf auf den Befehl Union, um aus dieser Abfrage eine Union-Abfrage zu machen.

  3. Kopieren Sie die SQL-Anweisungen aus Abfrage1 und Abfrage2, und fügen Sie sie in Abfrage3 ein. Achten Sie darauf, das zusätzliche Semikolon zu entfernen und das UNION Schlüsselwort (keyword) hinzuzufügen. Anschließend können Sie Ihre Ergebnisse in der Datenblattansicht überprüfen.

  4. Fügen Sie einer der Abfragen eine Bestellklausel hinzu, und fügen Sie die ORDER BY Anweisung in die Union-Abfrage in der SQL-Ansicht ein. Beachten Sie, dass in Abfrage3, der Union-Abfrage, beim Anfügen der Reihenfolge zuerst die Semikolons entfernt werden, dann der Tabellenname aus den Feldnamen.

  5. Das Finale SQL , das die Namen für dieses Beispiel für eine Union-Abfrage kombiniert und sortiert, lautet wie folgt:

    SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
    FROM Customers
    
    UNION
    
    SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
    FROM Suppliers
    
    ORDER BY [Last Name], [First Name];
    

Wenn Sie mit dem Schreiben SQL von Syntax sehr vertraut sind, können Sie Ihre eigene SQL Anweisung für die Union-Abfrage direkt in der SQL-Ansicht schreiben. Möglicherweise finden Sie es aber hilfreich, dem Ansatz "Kopieren und Einfügen von SQL aus anderen Abfrageobjekten" zu folgen. Jede Abfrage kann viel komplizierter als die hier verwendeten Beispiele für einfache Auswahlabfragen sein. Es kann für Sie vorteilhaft sein, jede Abfrage sorgfältig zu erstellen und zu testen, bevor Sie sie in der Union-Abfrage kombinieren. Wenn die Ausführung Ihrer Union-Abfrage fehlschlägt, können Sie jede Abfrage einzeln so lange anpassen, bis sie gelingt, und dann die Union-Abfrage mit der korrigierten Syntax erneut erstellen.

Schauen Sie sich die restlichen Abschnitte dieses Artikels an, um weitere Tipps und Tricks zur Verwendung von Union-Abfragen kennenzulernen.

Kombinieren von drei oder mehr Tabellen oder Abfragen in einer Union-Abfrage

Im Beispiel aus dem vorherigen Abschnitt, in dem die Northwind-Datenbank verwendet wird, werden nur Daten aus zwei Tabellen kombiniert. Sie können jedoch drei oder mehr Tabellen ganz einfach in einer Union-Abfrage kombinieren. So könnten Sie beispielsweise, aufbauend auf dem vorherigen Beispiel, auch die Namen der Mitarbeiter in die Abfrageausgabe einbeziehen. Zur Erledigung dieser Aufgabe können Sie eine dritte Abfrage hinzufügen und mit einem zusätzlichen UNION-Schlüsselwort wie dem folgenden mit der vorherigen SQL-Anweisung kombinieren:


SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Wenn Sie das Ergebnis in der Datenblattansicht anzeigen, werden alle Mitarbeiter mit dem Beispielfirmennamen aufgelistet, was wahrscheinlich nicht sehr nützlich ist. Wenn in diesem Feld angezeigt werden soll, ob eine Person ein interner Mitarbeiter, ein Lieferant oder ein Kunde ist, können Sie anstelle des Firmennamens einen festen Wert verwenden. So sieht das SQL aus:


SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Und so wird das Ergebnis in der Datenblattansicht angezeigt. Access zeigt diese fünf Beispieldatensätze an:

Beschäftigung Nachname Vorname
Intern Faber Giselle
Intern Becker Laura
Lieferant Gasper Niklas
Kunde Gunther Killian
Kunde Graf Kasper

Sie können die Abfrage sogar noch weiter reduzieren, da Access die Namen der Ausgabefelder nur ab der ersten Abfrage in einer Union-Abfrage liest. Hier wird die Ausgabe aus dem zweiten und dritten Abfrageabschnitt entfernt:


SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers

UNION

SELECT "In-house", [Last Name], [First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Filtern in Union-Abfragen

In einer Access Union-Abfrage ist die Sortierung nur einmal zulässig, aber Sie können jede Abfrage einzeln filtern. Aufbauend auf der Union-Abfrage des vorherigen Abschnitts finden Sie hier ein Beispiel, das jede Abfrage durch Hinzufügen einer WHERE Klausel filtert.


SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"

UNION

SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"

ORDER BY [Last Name], [First Name];

Wechseln Sie zur Datenblattansicht. Dort werden ähnliche Ergebnisse wie diese angezeigt:

Beschäftigung Nachname Vorname
Lieferant Endemann Elke
Intern Faber Giselle
Kunde Hembrock Detlef
Intern Heinrich Jule
Lieferant Hoffmann Jana
Kunde Möller Gabriel
Lieferant Sachweh Jan
Lieferant Schmitt Kai
Intern Tropschuh Maximilian
Lieferant Wagner Lina
Intern Wilske Adrian

Mischen von Datentypen

Wenn die Abfragen, die Sie verbinden, sehr unterschiedlich sind, kann es vorkommen, dass ein Ausgabefeld Daten unterschiedlichen Datentyps kombinieren muss. In diesem Fall gibt die Union-Abfrage die Ergebnisse meistens als Textdatentyp zurück, weil dieser Datentyp sowohl Text als auch Zahlen enthalten kann.

Um zu verstehen, wie dies funktioniert, verwenden wir die Verbundabfrage "Product Transactions " in der Northwind-Beispieldatenbank. Öffnen Sie diese Beispieldatenbank, und öffnen Sie dann die Abfrage "Produkttransaktionen" in der Datenblattansicht. Die letzten zehn Datensätze sollten dieser Ausgabe ähneln:

Produkt-ID Bestelldatum Firmenname Buchung Menge
77 22.01.2006 Lieferant B Einkauf 60
80 22.01.2006 Lieferant D Einkauf 75
81 22.01.2006 Lieferant A Einkauf 125
81 22.01.2006 Lieferant A Einkauf 200
7 20.01.2006 Firma D Verkauf 10
51 20.01.2006 Firma D Verkauf 10
80 20.01.2006 Firma D Verkauf 10
34 15.01.2006 Firma AA Verkauf 100
80 15.01.2006 Firma AA Verkauf 30

Angenommen, Sie möchten das Feld "Anzahl" in zwei Felder aufteilen: "Kaufen" und "Verkaufen". Angenommen, Sie möchten einen festen Nullwert für das Feld ohne Wert. So sieht die SQL für diese Union-Abfrage aus:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Wenn Sie zur Datenblattansicht wechseln, werden die letzten zehn Datensätze jetzt so angezeigt:

Produkt-ID Bestelldatum Firmenname Buchung Kaufen Verkaufen
74 22.01.2006 Lieferant B Einkauf 20 0
77 22.01.2006 Lieferant B Einkauf 60 0
80 22.01.2006 Lieferant D Einkauf 75 0
81 22.01.2006 Lieferant A Einkauf 125 0
81 22.01.2006 Lieferant A Einkauf 200 0
7 20.01.2006 Firma D Verkauf 0 10
51 20.01.2006 Firma D Verkauf 0 10
80 20.01.2006 Firma D Verkauf 0 10
34 15.01.2006 Firma AA Verkauf 0 100
80 15.01.2006 Firma AA Verkauf 0 30

Was geschieht, wenn die Felder mit Nullwerten leer sein sollen? Sie können die SQL so ändern, dass nichts statt Null angezeigt wird, indem Sie das Null Schlüsselwort (keyword) hinzufügen, wie hier gezeigt:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Wie Sie aber vielleicht beim Wechseln zur Datenblattansicht beobachtet haben, gibt es nun ein unerwartetes Ergebnis. In der Spalte "Kaufen" wurde der Inhalt jedes Felds gelöscht:

Produkt-ID Bestelldatum Firmenname Buchung Kaufen Verkaufen
74 22.01.2006 Lieferant B Einkauf
77 22.01.2006 Lieferant B Einkauf
80 22.01.2006 Lieferant D Einkauf
81 22.01.2006 Lieferant A Einkauf
81 22.01.2006 Lieferant A Einkauf
7 20.01.2006 Firma D Verkauf 10
51 20.01.2006 Firma D Verkauf 10
80 20.01.2006 Firma D Verkauf 10
34 15.01.2006 Firma AA Verkauf 100
80 15.01.2006 Firma AA Verkauf 30

Der Grund: Access ermittelt die Datentypen der Felder aus der ersten Abfrage. In diesem Beispiel ist "Null" keine Zahl.

Was passiert also, wenn Sie versuchen, eine leere Zeichenfolge für den leeren Wert der Felder einzufügen? Die SQL für diesen Versuch könnte wie folgt aussehen:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Wenn Sie zur Datenblattansicht wechseln, sehen Sie, dass Access die Werte für "Kaufen" abruft, diese Werte aber in Text konvertiert hat. Sie wissen, dass es sich hier um Textwerte handelt, weil diese in der Datenblattansicht linksbündig ausgerichtet sind. Weil die leere Zeichenfolge in der ersten Abfrage keine Zahl ist, werden diese Ergebnisse angezeigt. Außerdem werden Sie feststellen, dass die Werte für "Verkaufen" ebenfalls in Text konvertiert wurden, weil die Datensätze für "Einkauf" eine leere Zeichenfolge enthalten.

Produkt-ID Bestelldatum Firmenname Buchung Kaufen Verkaufen
74 22.01.2006 Lieferant B Einkauf 20
77 22.01.2006 Lieferant B Einkauf 60
80 22.01.2006 Lieferant D Einkauf 75
81 22.01.2006 Lieferant A Einkauf 125
81 22.01.2006 Lieferant A Einkauf 200
7 20.01.2006 Firma D Verkauf 10
51 20.01.2006 Firma D Verkauf 10
80 20.01.2006 Firma D Verkauf 10
34 15.01.2006 Firma AA Verkauf 100
80 15.01.2006 Firma AA Verkauf 30

Wie können Sie also dieses Puzzle lösen?

Eine Lösung besteht darin, die Abfrage zu zwingen, zu erwarten, dass der Feldwert eine Zahl ist. Mit diesem Ausdruck können Sie das tun:


IIf(False, 0, Null)

Die zu prüfende FalseBedingung ist nie True, daher gibt der Ausdruck immer zurück Null. Access wertet jedoch weiterhin beide Ausgabeoptionen aus und behandelt die Ausgabe als numerisch oder Null.

Diesen Ausdruck können wir in unserem Arbeitsbeispiel folgendermaßen verwenden:


SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Sie müssen die zweite Abfrage nicht ändern.

Wenn Sie zur Datenblattansicht wechseln, wird jetzt das gewünschte Ergebnis angezeigt:

Produkt-ID Bestelldatum Firmenname Buchung Kaufen Verkaufen
74 22.01.2006 Lieferant B Einkauf 20
77 22.01.2006 Lieferant B Einkauf 60
80 22.01.2006 Lieferant D Einkauf 75
81 22.01.2006 Lieferant A Einkauf 125
81 22.01.2006 Lieferant A Einkauf 200
7 20.01.2006 Firma D Verkauf 10
51 20.01.2006 Firma D Verkauf 10
80 20.01.2006 Firma D Verkauf 10
34 15.01.2006 Firma AA Verkauf 100
80 15.01.2006 Firma AA Verkauf 30

Als alternative Methode zur Erzielung desselben Ergebnisses können Sie die Abfragen in der Union-Abfrage bei noch einer weiteren Abfrage voranstellen:

SELECT
  0 As [Product ID], Date() As [Order Date],
  "" As [Company Name], "" As [Transaction],
  0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

Access gibt für jedes Feld feste Werte des definierten Datentyps zurück. Natürlich möchten Sie nicht, dass die Ausgabe dieser Abfrage die Ergebnisse beeinträchtigt. Der Trick, dies zu vermeiden, besteht darin, eine WHERE-Klausel zu False einzuschließen:

WHERE False

Das ist ein kleiner Trick. Da die Bedingung immer falsch ist, gibt die Abfrage nichts zurück. Wenn diese Anweisung mit der vorhandenen SQL-Anweisung kombiniert wird, sieht die abgeschlossene Anweisung so aus:

SELECT
  0 As [Product ID], Date() As [Order Date],
  "" As [Company Name], "" As [Transaction],
  0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Hinweis

In diesem Beispiel gibt die kombinierte Abfrage in der Datenbank "Northwind" 100 Datensätze zurück, während die beiden einzelnen Abfragen 58 und 43 Datensätze für insgesamt 101 Datensätze zurückgeben. Dieser Unterschied tritt auf, weil zwei Datensätze nicht eindeutig sind. Weitere Informationen zur Lösung dieses Szenarios mithilfe UNION ALLvon finden Sie unter Arbeiten mit unterschiedlichen Datensätzen in Union-Abfragen mit UNION ALL.

Hinzufügen von Summen in einer Union-Abfrage

Eine besondere Verwendung für eine Union-Abfrage ist das Kombinieren einer Gruppe von Datensätzen mit einem Datensatz, der die Summe von einem oder mehreren Feldern enthält.

Hier ist ein weiteres Beispiel, das Sie in der Northwind-Beispieldatenbank erstellen können, um zu veranschaulichen, wie Sie in einer Union-Abfrage eine Summe erhalten.

  1. Erstellen Sie eine neue einfache Abfrage, um den Einkauf von Bier ("Produkt-ID=34" in der Northwind-Datenbank) anzuzeigen, und verwenden Sie dazu folgende SQL-Syntax:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
    
  2. Wechseln Sie zur Datenblattansicht. Dort sollten vier Einkäufe angezeigt werden:

    Empfangsdatum Menge
    22.01.2006 100
    22.01.2006 60
    04.04.2006 50
    05.04.2006 300
  3. Um die Summe zu erhalten, erstellen Sie mit der folgenden SQL-Anweisung eine einfache Aggregatabfrage:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
  4. Wechseln Sie zur Datenblattansicht. Dort sollte nur ein einziger Datensatz angezeigt werden:

    MaxVonEmpfangsdatum SummeVonMenge
    05.04.2006 510
  5. Kombinieren Sie diese beiden Abfragen in einer Union-Abfrage, um den Datensatz mit der Gesamtmenge an die Einkaufsdatensätze anzufügen:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    UNION
    
    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
    
  6. Wechseln Sie zur Datenblattansicht. Dort sollten die vier Einkäufe mit der Summe für jeden Einkauf angezeigt werden, gefolgt von einem Datensatz mit der Summe der Menge:

    Empfangsdatum Menge
    22.01.2006 60
    22.01.2006 100
    04.04.2006 50
    05.04.2006 300
    05.04.2006 510

Damit werden die Grundlagen des Hinzufügens von Summen zu einer Union-Abfrage abgedeckt. Sie können auch feste Werte in beide Abfragen aufnehmen, z. B. "Detail" und "Summe", um den Gesamtdatensatz visuell von den anderen Datensätzen zu trennen. Im Abschnitt Kombinieren von drei oder mehr Tabellen oder Abfragen in einer Union-Abfrage können Sie die Verwendung von festen Werten nachlesen.

Arbeiten mit eindeutigen Datensätzen in Union-Abfragen unter Verwendung von UNION ALL

Union-Abfragen in Access enthalten standardmäßig nur eindeutige Datensätze. Was ist aber, wenn Sie alle Datensätze einbeziehen möchten? Hier könnte ein weiteres Beispiel hilfreich sein.

Im vorstehenden Abschnitt wurde gezeigt, wie Sie in einer Union-Abfrage eine Summe erstellen. Ändern Sie diese Union-Abfrage SQL so, dass sie Folgendes enthält Product ID = 48:


SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION

SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Purchase Order Details].[Date Received];

Wechseln Sie zur Datenblattansicht. Dort sollte ein etwas irreführendes Ergebnis angezeigt werden:

Empfangsdatum Menge
22.01.2006 100
22.01.2006 200

Natürlich gibt ein Datensatz nicht die doppelte Gesamtmenge zurück.

Dieses Ergebnis wird angezeigt, weil an einem Tag dieselbe Menge Schokolade zweimal verkauft wurde, wie in der Tabelle "Bestelldetails" erfasst. Hier ist ein einfaches Auswahlabfrageergebnis, das beide Datensätze in der Northwind-Beispieldatenbank anzeigt:

Auftrags-Nr. Produkt Quantity
100 Northwind Traders – Schokolade 100
92 Northwind Traders – Schokolade 100

In der zuvor erwähnten Union-Abfrage können Sie sehen, dass das Feld "Bestell-ID" nicht enthalten ist und dass die beiden Felder keine zwei unterschiedlichen Datensätze bilden.

Wenn Sie alle Datensätze einbeziehen möchten, verwenden Sie UNION ALL anstelle von UNION ".SQL Dies wirkt sich höchstwahrscheinlich auf die Sortierung der Ergebnisse aus. Daher sollten Sie auch eine ORDER BY Klausel zum Bestimmen einer Sortierreihenfolge einfügen. Hier ist die Änderung SQL , die auf dem vorherigen Beispiel basiert:


SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION ALL

SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Total];

Wechseln Sie zur Datenblattansicht. Dort sollten alle Details zusätzlich zur Summe als letztem Datensatz angezeigt werden:

Empfangsdatum Summe Menge
22.01.2006 100
22.01.2006 100
22.01.2006 Summe 200

Verwenden einer Union-Abfrage zum Filtern von Datensätzen in einem Formular über ein Kombinationsfeld-Steuerelement

Eine Union-Abfrage wird in einem Formular häufig als Datensatzquelle für ein Kombinationsfeld-Steuerelement verwendet. Sie können über dieses Kombinationsfeld einen Wert auswählen, um die Datensätze des Formulars zu filtern. Beispielsweise können Sie die Datensätze von Mitarbeitern nach deren Ort filtern.

Wenn Sie sehen möchten, wie das funktioniert, ist hier ein weiteres Beispiel, das Sie zur Veranschaulichung dieses Szenarios in der Northwind-Beispieldatenbank erstellen können.

  1. Erstellen Sie eine einfache Auswahlabfrage mit dieser SQL Syntax:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
    
  2. Wechseln Sie zur Datenblattansicht. Dort sollten die folgenden Ergebnisse angezeigt werden:

    Ort Filter
    Stuttgart Stuttgart
    Baden-Baden Baden-Baden
    Regensburg Regensburg
    Köln Köln
    Stuttgart Stuttgart
    Regensburg Regensburg
    Stuttgart Stuttgart
    Regensburg Regensburg
    Stuttgart Stuttgart
  3. Wenn Sie sich diese Ergebnisse anschauen, werden möglicherweise nicht viele Werte angezeigt. Erweitern Sie jedoch die Abfrage, und wandeln Sie sie mithilfe folgender Elemente SQLin eine Union-Abfrage um:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
    
  4. Wechseln Sie zur Datenblattansicht. Dort sollten die folgenden Ergebnisse angezeigt werden:

    Ort Filter
    <Alle> *
    Baden-Baden Baden-Baden
    Köln Köln
    Regensburg Regensburg
    Stuttgart Stuttgart

    Access führt eine Vereinigung der neun zuvor gezeigten Datensätze mit festen Feldwerten wie <"Alle> " und "*" durch. Da diese Union-Klausel nicht enthält UNION ALL, gibt Access nur unterschiedliche Datensätze zurück. Das bedeutet, dass jede Stadt nur einmal mit festen identischen Werten zurückgegeben wird.

  5. Nachdem Sie nun über eine abgeschlossene Union-Abfrage verfügen, die den Namen jedes Ortes nur einmal anzeigt, zusammen mit einer Option, die effektiv alle Städte auswählt, können Sie diese Abfrage als Datensatzquelle für ein Kombinationsfeld in einem Formular verwenden. Wenn Sie dieses konkrete Beispiel als Modell verwenden, können Sie ein Kombinationsfeld-Steuerelement in einem Formular erstellen, diese Abfrage als Datensatzquelle festlegen, die Spaltenbreite-Eigenschaft der Filterspalte auf 0 (Null) festlegen, um sie visuell auszublenden, und dann die Bound Column-Eigenschaft auf 1 festlegen, um den Index der zweiten Spalte anzugeben. In der Filter Eigenschaft des Formulars selbst können Sie dann Code wie den folgenden hinzufügen, um einen Formularfilter mithilfe des im Kombinationsfeld-Steuerelement ausgewählten Werts zu aktivieren:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True
    

    Der Benutzer des Formulars kann dann die Formulardatensätze nach einem bestimmten Ortsnamen filtern oder Alle> auswählen<, um alle Datensätze für alle Orte aufzulisten.

Seitenanfang