Monday, February 6, 2023

Verwenden Sie eine Vereinigungsabfrage, um mehrere Abfragen zu einem einzigen Ergebnis zu kombinieren – Microsoft Support

Verwenden Sie eine Union-Abfrage, um mehrere Abfragen zu einem einzigen Ergebnis zu kombinieren

Manchmal möchten Sie vielleicht die Datensätze aus einer Tabelle auflisten oder mit denen aus einer oder mehreren anderen Tabellen abfragen, um einen Satz von Datensätzen zu bilden – eine Liste mit allen Datensätzen aus zwei oder mehr Tabellen. Dies ist der Zweck einer Union-Abfrage in Access.

Um Vereinigungsabfragen effektiv zu verstehen, sollten Sie sich zunächst mit dem Entwerfen grundlegender Auswahlabfragen in Access vertraut machen. Weitere Informationen zum Entwerfen von Auswahlabfragen finden Sie unter Erstellen einer einfachen Auswahlabfrage .

Hinweis: Der Inhalt dieses Artikels ist für die Verwendung mit Access-Desktopdatenbanken vorgesehen. Sie können keine Union-Abfrage in Access-Webdatenbanken oder Access-Web-Apps erstellen oder verwenden.

Studieren Sie ein Beispiel für eine Arbeitsgruppenabfrage

Wenn Sie noch nie eine Union-Abfrage erstellt haben, ist es möglicherweise hilfreich, zunächst ein funktionierendes Beispiel in der Northwind Access-Vorlage zu studieren. Sie können auf der Seite „Erste Schritte" von Access nach der Northwind-Beispielvorlage suchen, indem Sie auf Datei > Neu klicken, oder Sie können direkt eine Kopie von diesem Speicherort herunterladen: Northwind-Beispielvorlage .

Nachdem Access die Northwind-Datenbank geöffnet hat, schließen Sie das Anmeldedialogfeld, das zuerst angezeigt wird, und erweitern Sie dann den Navigationsbereich. Klicken Sie auf den oberen Rand des Navigationsbereichs und wählen Sie dann Objekttyp aus, um alle Datenbankobjekte nach ihrem Typ zu organisieren. Erweitern Sie als Nächstes die Gruppe Abfragen und Sie sehen eine Abfrage namens Produkttransaktionen .

Union-Abfragen sind leicht von anderen Abfrageobjekten zu unterscheiden, da sie ein spezielles Symbol haben, das zwei verschlungenen Kreisen ähnelt, die eine vereinte Menge aus zwei Mengen darstellen:

Screenshot eines Union-Abfragesymbols in Access.

Im Gegensatz zu normalen Auswahl- und Aktionsabfragen stehen Tabellen in einer Union-Abfrage nicht in Beziehung, was bedeutet, dass der grafische Abfrage-Designer von Access nicht zum Erstellen oder Bearbeiten von Union-Abfragen verwendet werden kann. Sie werden dies erleben, wenn Sie eine Vereinigungsabfrage aus dem Navigationsbereich öffnen; Access öffnet es und zeigt die Ergebnisse in der Datenblattansicht an. Unter dem Befehl „ Ansichten " auf der Registerkarte „ Startseite " werden Sie feststellen, dass die Entwurfsansicht nicht verfügbar ist, wenn Sie mit Vereinigungsabfragen arbeiten. Sie können nur zwischen der Datenblattansicht und der SQL-Ansicht wechseln, wenn Sie mit Union-Abfragen arbeiten.

Um Ihr Studium dieses Union- Abfragebeispiels fortzusetzen, klicken Sie auf Start > Ansichten > SQL-Ansicht , um die SQL-Syntax anzuzeigen, die sie definiert. In dieser Abbildung haben wir einige zusätzliche Leerzeichen in der SQL hinzugefügt, damit Sie die verschiedenen Teile, aus denen eine Union-Abfrage besteht, leicht erkennen können.

Ihr Browser unterstützt kein Video. Installieren Sie Microsoft Silverlight, Adobe Flash Player oder Internet Explorer 9.

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 der dritte Teil dieser SQL-Anweisung sind im Wesentlichen zwei ausgewählte Abfragen. Diese Abfragen rufen zwei verschiedene Sätze 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, das Access mitteilt, dass diese Abfrage diese beiden Datensätze kombinieren wird.

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 keine Werte in der Datenblattansicht ändern.

Erstellen Sie eine Union-Abfrage, indem Sie ausgewählte Abfragen erstellen und kombinieren

Auch wenn Sie eine Union-Abfrage erstellen können, indem Sie die SQL-Syntax direkt in die SQL-Ansicht schreiben, finden Sie 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 ansehen möchten, lesen Sie den nächsten Abschnitt, Sehen Sie sich ein Beispiel zum Erstellen einer Union-Abfrage an .

  1. Klicken Sie auf der Registerkarte Erstellen in der Gruppe Abfragen auf Abfrageentwurf .

  2. Doppelklicken Sie auf die Tabelle mit den einzuschließenden Feldern. Die Tabelle wird dem Abfrageentwurfsfenster hinzugefügt.

  3. Doppelklicken Sie im Abfrageentwurfsfenster auf alle Felder, die Sie einbeziehen möchten. Stellen Sie beim Auswählen von Feldern sicher, dass Sie dieselbe Anzahl von Feldern in derselben Reihenfolge hinzufügen, die Sie den anderen ausgewählten Abfragen hinzufügen. Achten Sie sorgfältig auf die Datentypen der Felder und stellen Sie sicher, dass sie kompatible Datentypen mit Feldern an derselben Position in den anderen Abfragen haben, die Sie kombinieren. Wenn Ihre erste Auswahlabfrage beispielsweise fünf Felder hat, von denen das erste Datums-/Uhrzeitdaten enthält, stellen Sie sicher, dass jede der anderen Auswahlabfragen, die Sie kombinieren, ebenfalls fünf Felder hat, von denen das erste Datums-/Uhrzeitdaten enthält. usw.

  4. Fügen Sie Ihren Feldern optional Kriterien hinzu, indem Sie die entsprechenden Ausdrücke in die Zeile Kriterien des Feldrasters eingeben.

  5. Nachdem Sie das Hinzufügen von Feldern und Feldkriterien abgeschlossen haben, sollten Sie die Auswahlabfrage ausführen und ihre Ausgabe überprüfen. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen .

  6. Wechseln Sie die Abfrage in die Entwurfsansicht.

  7. Speichern Sie die Auswahlabfrage und lassen Sie sie geöffnet.

  8. Wiederholen Sie diesen Vorgang für jede der ausgewählten Abfragen, die Sie kombinieren möchten.

Nachdem Sie nun 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 Design in der Gruppe Abfrage auf Union . Access blendet das Abfrageentwurfsfenster aus und zeigt die Objektregisterkarte der SQL-Ansicht an. Zu diesem Zeitpunkt ist die Objektregisterkarte der SQL-Ansicht leer.

  3. Klicken Sie auf die Registerkarte für die erste Auswahlabfrage, die Sie in der Vereinigungsabfrage kombinieren möchten.

  4. Klicken Sie auf der Registerkarte Start auf Ansicht > SQL-Ansicht .

  5. Kopieren Sie die SQL-Anweisung für die Auswahlabfrage. Klicken Sie auf die Registerkarte für die Union-Abfrage, die Sie zuvor erstellt haben.

  6. Fügen Sie die SQL-Anweisung für die Auswahlabfrage in die Registerkarte „SQL-Ansichtsobjekt" der Union-Abfrage ein.

  7. Löschen Sie das Semikolon (;) am Ende der Select-Query-SQL-Anweisung.

  8. Drücken Sie die Eingabetaste, um den Cursor eine Zeile nach unten zu bewegen, und geben Sie dann UNION in die neue Zeile ein.

  9. Klicken Sie auf die Registerkarte für die nächste Auswahlabfrage, die Sie in der Vereinigungsabfrage kombinieren möchten.

  10. Wiederholen Sie die Schritte 5 bis 10, bis Sie alle SQL-Anweisungen für die ausgewählten Abfragen kopiert und in das SQL-Ansichtsfenster der Union-Abfrage eingefügt haben. Löschen Sie nicht das Semikolon und geben Sie nichts nach der SQL-Anweisung für die letzte Auswahlabfrage 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.

Sehen Sie sich ein Beispiel zum Erstellen einer Union-Abfrage an

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

Ihr Browser unterstützt kein Video. Installieren Sie Microsoft Silverlight, Adobe Flash Player oder Internet Explorer 9.

Hier sind die Schritte, die zum Erstellen dieses Beispiels erforderlich sind:

  1. Erstellen Sie zwei ausgewählte Abfragen namens Abfrage1 und Abfrage2 mit den Tabellen „Kunden" bzw. „Lieferanten" als Datenquellen. Verwenden Sie die Felder „Vorname" und „Nachname" als Anzeigewerte.

  2. Erstellen Sie zunächst eine neue Abfrage mit dem Namen „Query3" ohne Datenquelle und klicken Sie dann auf den Befehl „ Union " auf der Registerkarte „ Entwurf ", um diese Abfrage in eine Union-Abfrage umzuwandeln.

  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 Schlüsselwort UNION hinzuzufügen. Anschließend können Sie Ihre Ergebnisse in der Datenblattansicht überprüfen.

  4. Fügen Sie eine Sortierklausel in eine der Abfragen ein und fügen Sie dann die Anweisung ORDER BY in die SQL-Ansicht der Union-Abfrage ein. Beachten Sie, dass in Query3, der Union-Abfrage, wenn die Sortierung angehängt werden soll, zuerst die Semikolons entfernt werden, dann der Tabellenname aus den Feldnamen.

  5. Die letzte SQL, die die Namen für dieses Union-Abfragebeispiel kombiniert und sortiert, lautet wie folgt:

      WÄHLEN Sie Kunden.Firma, Kunden.[Nachname], Kunden.[Vorname]  VON Kunden    UNION    SELECT Suppliers.Company, Suppliers.[Nachname], Suppliers.[Vorname]  VON Lieferanten    BESTELLUNG NACH [Nachname], [Vorname];

Wenn Sie mit dem Schreiben von SQL-Syntax vertraut sind, können Sie sicherlich Ihre eigene SQL-Anweisung für die Union-Abfrage direkt in die SQL-Ansicht schreiben. Es kann jedoch hilfreich sein, den Ansatz des Kopierens und Einfügens von SQL aus anderen Abfrageobjekten zu verfolgen. Jede Abfrage kann viel komplizierter sein als die hier verwendeten einfachen ausgewählten Abfragebeispiele. Es kann von Vorteil sein, jede Abfrage sorgfältig zu erstellen und zu testen, bevor Sie sie in der Vereinigungsabfrage kombinieren. Wenn die Union-Abfrage nicht ausgeführt werden kann, können Sie jede Abfrage einzeln anpassen, bis sie erfolgreich ist, und dann Ihre Union-Abfrage mit der korrigierten Syntax neu erstellen.

Lesen Sie die verbleibenden Abschnitte dieses Artikels, um weitere Tipps und Tricks zur Verwendung von Union-Abfragen zu erhalten.

Im Beispiel aus dem vorherigen Abschnitt mit der Northwind-Datenbank werden nur Daten aus zwei Tabellen kombiniert. Sie können jedoch sehr einfach drei oder mehr Tabellen in einer Union-Abfrage kombinieren. Aufbauend auf dem vorherigen Beispiel möchten Sie vielleicht auch die Namen der Mitarbeiter in die Abfrageausgabe aufnehmen. Sie können diese Aufgabe erfüllen, indem Sie eine dritte Abfrage hinzufügen und mit der vorherigen SQL-Anweisung mit einem zusätzlichen UNION-Schlüsselwort wie dem folgenden kombinieren:

  WÄHLEN Sie Kunden.Firma, Kunden.[Nachname], Kunden.[Vorname]  VON Kunden    UNION    SELECT Suppliers.Company, Suppliers.[Nachname], Suppliers.[Vorname]  VON Lieferanten    UNION    SELECT Mitarbeiter.Firma, Mitarbeiter.[Nachname], Mitarbeiter.[Vorname]  VON Mitarbeitern    BESTELLUNG NACH [Nachname], [Vorname];

Wenn Sie das Ergebnis in der Datenblattansicht anzeigen, werden alle Mitarbeiter mit dem Beispielfirmennamen aufgelistet, was wahrscheinlich nicht sehr nützlich ist. Wenn dieses Feld angeben soll, ob es sich bei einer Person um einen internen Mitarbeiter, einen Lieferanten oder einen Kunden handelt, können Sie anstelle des Firmennamens einen festen Wert angeben. So würde die SQL aussehen:

  WÄHLEN Sie „Kunde" als Beschäftigung, Kunden.[Nachname], Kunden.[Vorname]  VON Kunden    UNION    WÄHLEN Sie „Lieferant" als Beschäftigung, Lieferanten.[Nachname], Lieferanten.[Vorname]  VON Lieferanten    UNION    WÄHLEN Sie „Inhouse" als Anstellung, Mitarbeiter.[Nachname], Mitarbeiter.[Vorname]  VON Mitarbeitern    BESTELLUNG NACH [Nachname], [Vorname];

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

Anstellung

Familienname, Nachname

Vorname

Im Haus

Freehafer

Nancy

Im Haus

Giussani

Laura

Anbieter

Glasson

Stuart

Kunde

Goldschmidt

Daniel

Kunde

Gratacós Solsona

Antonio

Die obige Abfrage kann noch weiter reduziert werden, da Access in einer Union-Abfrage nur die Namen der Ausgabefelder aus der ersten Abfrage liest. Hier sehen Sie, dass wir die Ausgabe aus dem zweiten und dritten Abfrageabschnitt entfernt haben:

  WÄHLEN Sie „Kunde" als Beschäftigung, [Nachname], [Vorname]  VON Kunden    UNION    WÄHLEN Sie „Lieferant", [Nachname], [Vorname]  VON Lieferanten    UNION    WÄHLEN Sie „Inhouse", [Nachname], [Vorname]  VON Mitarbeitern    BESTELLUNG NACH [Nachname], [Vorname]; 

In einer Access Union-Abfrage ist die Sortierung nur einmal zulässig, aber jede Abfrage kann einzeln gefiltert werden. Aufbauend auf der Union-Abfrage des vorherigen Abschnitts ist hier ein Beispiel dafür, wo wir jede Abfrage gefiltert haben, indem wir eine WHERE-Klausel hinzugefügt haben.

  WÄHLEN Sie „Kunde" als Beschäftigung, Kunden.[Nachname], Kunden.[Vorname]  VON Kunden  WHERE [Bundesland/Provinz] = "UT"    UNION    WÄHLEN Sie „Lieferant", [Nachname], [Vorname]  VON Lieferanten  WHERE [Jobtitel] = „Vertriebsleiter"    UNION    WÄHLEN Sie „Inhouse", Mitarbeiter.[Nachname], Mitarbeiter.[Vorname]  VON Mitarbeitern  WO Stadt = "Seattle"    BESTELLUNG NACH [Nachname], [Vorname];

Wechseln Sie zur Datenblattansicht und Sie sehen ähnliche Ergebnisse:

Anstellung

Familienname, Nachname

Vorname

Anbieter

Andersen

Elisabeth A.

Im Haus

Freehafer

Nancy

Kunde

Hasselberg

Jonas

Im Haus

Hellung Larsen

Anne

Anbieter

Hernández-Echevarria

Amaya

Kunde

Mortensen

Sven

Anbieter

Sandberg

Michael

Anbieter

Sousa

Luis

Im Haus

Thorpe

Stefan

Anbieter

Weiler

Cornelia

Im Haus

Zare

Robert

Wenn die Abfragen für Union sehr unterschiedlich sind, kann es vorkommen, dass ein Ausgabefeld Daten verschiedener Datentypen kombinieren muss. In diesem Fall gibt die Union-Abfrage die Ergebnisse meistens als Textdatentyp zurück, da dieser Datentyp sowohl Text als auch Zahlen enthalten kann.

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

Produkt ID

Auftragsdatum

Name der Firma

Transaktion

Menge

77

22.1.2006

Lieferant B

Kaufen

60

80

22.1.2006

Lieferant D

Kaufen

75

81

22.1.2006

Lieferant A

Kaufen

125

81

22.1.2006

Lieferant A

Kaufen

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

Nehmen wir an, Sie möchten das Feld Menge in zwei Teile aufteilen – Kaufen und Verkaufen. Nehmen wir außerdem an, Sie möchten einen festen Nullwert für das Feld ohne Wert haben. So sieht die SQL für diese Union-Abfrage aus:

 WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], 0 als Kauf, [Menge] als Verkauf  VON [Produktbestellungen]    UNION    WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, 0 als Verkauf  VON [Produktkäufe]    BESTELLUNG BEI [Bestelldatum] DESC;

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

Produkt ID

Auftragsdatum

Name der Firma

Transaktion

Besorgen

Verkaufen

74

22.1.2006

Lieferant B

Kaufen

20

0

77

22.1.2006

Lieferant B

Kaufen

60

0

80

22.1.2006

Lieferant D

Kaufen

75

0

81

22.1.2006

Lieferant A

Kaufen

125

0

81

22.1.2006

Lieferant A

Kaufen

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

Um dieses Beispiel fortzusetzen, was ist, wenn Sie möchten, dass die Felder mit Null leer sind? Sie können die SQL so ändern, dass nichts anstelle von Null angezeigt wird, indem Sie das Schlüsselwort Null wie folgt hinzufügen:

 WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], Null als Kauf, [Menge] als Verkauf  VON [Produktbestellungen]    UNION    WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, Null als Verkauf  VON [Produktkäufe]    BESTELLUNG BEI [Bestelldatum] DESC;

Wie Sie jedoch vielleicht beobachtet haben, wie Sie zur Datenblattansicht wechseln, erhalten Sie jetzt ein unerwartetes Ergebnis. In der Spalte „Kaufen" sind alle Felder leer:

Produkt ID

Auftragsdatum

Name der Firma

Transaktion

Besorgen

Verkaufen

74

22.1.2006

Lieferant B

Kaufen

77

22.1.2006

Lieferant B

Kaufen

80

22.1.2006

Lieferant D

Kaufen

81

22.1.2006

Lieferant A

Kaufen

81

22.1.2006

Lieferant A

Kaufen

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 dafür ist, dass Access die Datentypen der Felder aus der ersten Abfrage bestimmt. In diesem Beispiel ist Null keine Zahl.

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

 WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], „" als Kauf, [Menge] als Verkauf  VON [Produktbestellungen]    UNION    WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, „" als Verkauf  VON [Produktkäufe]    BESTELLUNG BEI [Bestelldatum] DESC;

Wenn Sie zur Datenblattansicht wechseln, sehen Sie, dass Access die Buy-Werte abruft, die Werte jedoch in Text konvertiert. Sie erkennen, dass es sich um Textwerte handelt, da sie in der Datenblattansicht linksbündig ausgerichtet sind. Die leere Zeichenfolge in der ersten Abfrage ist keine Zahl, weshalb Sie diese Ergebnisse sehen. Sie werden auch feststellen, dass die Verkaufswerte ebenfalls in Text konvertiert werden, da die Kaufdatensätze eine leere Zeichenfolge enthalten.

Produkt ID

Auftragsdatum

Name der Firma

Transaktion

Besorgen

Verkaufen

74

22.1.2006

Lieferant B

Kaufen

20

77

22.1.2006

Lieferant B

Kaufen

60

80

22.1.2006

Lieferant D

Kaufen

75

81

22.1.2006

Lieferant A

Kaufen

125

81

22.1.2006

Lieferant A

Kaufen

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 löst man also dieses Rätsel?

Eine Lösung besteht darin, die Abfrage zu zwingen, zu erwarten, dass der Feldwert eine Zahl ist. Dies kann mit dem Ausdruck erreicht werden:

  IIf(Falsch, 0, Null)

Die zu prüfende Bedingung False ist niemals True , daher gibt der Ausdruck immer Null zurück, aber Access wertet dennoch beide Ausgabeoptionen aus und entscheidet, ob die Ausgabe numerisch oder Null ist.

So können wir diesen Ausdruck in unserem Arbeitsbeispiel verwenden:

  WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], IIf(False, 0, Null) als Kauf, [Menge] als Verkauf  VON [Produktbestellungen]    UNION    WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, Null als Verkauf  VON [Produktkäufe]    BESTELLUNG BEI [Bestelldatum] DESC;

Beachten Sie, dass die zweite Abfrage nicht geändert werden muss.

Wenn Sie zur Datenblattansicht wechseln, sehen Sie jetzt ein Ergebnis, das wir wollen:

Produkt ID

Auftragsdatum

Name der Firma

Transaktion

Besorgen

Verkaufen

74

22.1.2006

Lieferant B

Kaufen

20

77

22.1.2006

Lieferant B

Kaufen

60

80

22.1.2006

Lieferant D

Kaufen

75

81

22.1.2006

Lieferant A

Kaufen

125

81

22.1.2006

Lieferant A

Kaufen

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

Eine alternative Methode, um dasselbe Ergebnis zu erzielen, besteht darin, den Abfragen in der Union-Abfrage eine weitere Abfrage voranzustellen:

 WÄHLEN       0 als [Produkt-ID], Date() als [Bestelldatum],       "" Als [Firmenname], "" Als [Transaktion],       0 als Kauf, 0 als Verkauf  VON [Produktbestellungen]  WO Falsch

Access gibt für jedes Feld feste Werte des von Ihnen 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 in False einzufügen:

 WO Falsch

Dies ist ein kleiner Trick, da dies immer falsch ist und die Abfrage dann nichts zurückgibt. Wenn wir diese Anweisung mit dem vorhandenen SQL kombinieren, erhalten wir eine vollständige Anweisung wie folgt:

 WÄHLEN       0 als [Produkt-ID], Date() als [Bestelldatum],       "" Als [Firmenname], "" Als [Transaktion],       0 als Kauf, 0 als Verkauf  VON [Produktbestellungen]  WO Falsch    UNION    WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], Null als Kauf, [Menge] als Verkauf  VON [Produktbestellungen]    UNION    WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, Null als Verkauf  VON [Produktkäufe]    BESTELLUNG BEI [Bestelldatum] DESC;

Hinweis: Die kombinierte Abfrage hier in diesem Beispiel mit der Northwind-Datenbank gibt 100 Datensätze zurück, während die beiden einzelnen Abfragen 58 und 43 Datensätze zurückgeben, also insgesamt 101 Datensätze. Der Grund für diese Diskrepanz liegt darin, dass zwei Datensätze nicht eindeutig sind. Im Abschnitt Arbeiten mit unterschiedlichen Datensätzen in Union-Abfragen mit UNION ALL erfahren Sie, wie Sie dieses Szenario mit UNION ALL lösen können.

Ein Sonderfall für eine Union-Abfrage besteht darin, eine Reihe von Datensätzen mit einem Datensatz zu kombinieren, der die Summe eines oder mehrerer Felder enthält.

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

  1. Erstellen Sie eine neue einfache Abfrage zum Anzeigen des Bierkaufs (Produkt-ID=34 in der Northwind-Datenbank) mit der folgenden SQL-Syntax:

      WÄHLEN Sie [Bestelldetails].[Eingangsdatum], [Bestelldetails].Menge  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=34))    ORDER BY [Einzelheiten der Bestellung].[Datum des Eingangs]; 
  2. Wechseln Sie zur Datenblattansicht und Sie sollten vier Käufe sehen:

    Empfangsdatum

    Menge

    22.1.2006

    100

    22.1.2006

    60

    4.4.2006

    50

    05.04.2006

    300

  3. Um die Gesamtsumme zu erhalten, erstellen Sie eine einfache aggregierende Abfrage mit dem folgenden SQL:

      SELECT Max([Empfangsdatum]), Sum([Quantity]) AS SumOfQuantity  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=34)) 
  4. Wechseln Sie zur Datenblattansicht und Sie sollten nur einen Datensatz sehen:

    MaxOfDate erhalten

    SummeDerMenge

    05.04.2006

    510

  5. Kombinieren Sie diese beiden Abfragen zu einer Vereinigungsabfrage, um den Datensatz mit der Gesamtmenge an die Kaufdatensätze anzuhängen:

      WÄHLEN Sie [Bestelldetails].[Eingangsdatum], [Bestelldetails].Menge  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=34))    UNION    SELECT Max([Empfangsdatum]), Sum([Quantity]) AS SumOfQuantity  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=34))    ORDER BY [Einzelheiten der Bestellung].[Datum des Eingangs]; 
  6. Wechseln Sie zur Datenblattansicht und Sie sollten die vier Käufe mit der Summe von jedem sehen, gefolgt von einem Datensatz, der die Gesamtmenge ergibt:

    Empfangsdatum

    Menge

    22.1.2006

    60

    22.1.2006

    100

    4.4.2006

    50

    05.04.2006

    300

    05.04.2006

    510

Das deckt die Grundlagen des Hinzufügens von Summen zu einer Union-Abfrage ab. Möglicherweise möchten Sie auch feste Werte in beide Abfragen aufnehmen, z. B. „Detail" und „Gesamt", um den Gesamtdatensatz visuell von den anderen Datensätzen zu trennen. Sie können die Verwendung fester Werte im Abschnitt Kombinieren von drei oder mehr Tabellen oder Abfragen in einer Vereinigungsabfrage überprüfen .

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

Im vorherigen Abschnitt haben wir Ihnen gezeigt, wie Sie in einer Vereinigungsabfrage eine Summe erstellen. Ändern Sie diese Union-Abfrage-SQL so, dass sie die Produkt-ID = 48 enthält:

  WÄHLEN Sie [Bestelldetails].[Eingangsdatum], [Bestelldetails].Menge  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=48))    UNION    SELECT Max([Empfangsdatum]), Sum([Quantity]) AS SumOfQuantity  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=48))    ORDER BY [Einzelheiten der Bestellung].[Datum des Eingangs];

Wechseln Sie zur Datenblattansicht und Sie sollten ein etwas irreführendes Ergebnis sehen:

Empfangsdatum

Menge

22.1.2006

100

22.1.2006

200

Ein Datensatz ergibt in Summe natürlich nicht die doppelte Menge.

Sie sehen dieses Ergebnis, weil an einem Tag die gleiche Menge Pralinen zweimal verkauft wurde – wie in der Tabelle „Purchase Order Details" erfasst. Hier ist ein einfaches Auswahlabfrageergebnis, das beide Datensätze in der Northwind-Beispieldatenbank zeigt:

Bestellnummer

Produkt

Menge

100

Northwind Traders Schokolade

100

92

Northwind Traders Schokolade

100

In der zuvor erwähnten Vereinigungsabfrage können Sie sehen, dass das Feld „Purchase Order ID" nicht enthalten ist und dass die beiden Felder keine zwei unterschiedlichen Datensätze bilden.

Wenn Sie alle Datensätze einschließen möchten, verwenden Sie UNION ALL anstelle von UNION in Ihrem SQL. Dies wirkt sich höchstwahrscheinlich auf die Sortierung der Ergebnisse aus, daher sollten Sie möglicherweise auch eine ORDER BY-Klausel einfügen, um eine Sortierreihenfolge festzulegen. Hier ist das modifizierte SQL, das auf dem vorherigen Beispiel aufbaut:

  WÄHLEN Sie [Bestelldetails].[Eingangsdatum], Null als [Gesamtsumme], [Bestelldetails].Menge  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=48))    UNION ALLE    SELECT Max([Empfangsdatum]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity  VON [Bestelldetails]  WO ((([Bestelldetails].[Produkt-ID])=48))    BESTELLEN BEI [Gesamt];  

Wechseln Sie in die Datenblattansicht und Sie sollten alle Details sowie eine Gesamtsumme als letzten Datensatz sehen:

Empfangsdatum

Gesamt

Menge

22.1.2006

100

22.1.2006

100

22.1.2006

Gesamt

200

Eine übliche Verwendung für eine Union-Abfrage besteht darin, als Datensatzquelle für ein Kombinationsfeld-Steuerelement in einem Formular zu dienen. Sie können dieses Kombinationsfeld verwenden, um einen Wert auszuwählen, um die Datensätze des Formulars zu filtern. Filtern Sie beispielsweise die Mitarbeiterdatensätze nach ihrer Stadt.

Um zu sehen, wie dies funktionieren könnte, ist hier ein weiteres Beispiel, das Sie in der Northwind-Beispieldatenbank erstellen können, um dieses Szenario zu veranschaulichen.

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

      SELECT Mitarbeiter.Stadt, Mitarbeiter.Stadt AS Filter  VON Mitarbeitern; 
  2. Wechseln Sie zur Datenblattansicht und Sie sollten die folgenden Ergebnisse sehen:

    Stadt

    Filter

    Seattle

    Seattle

    Bellevue

    Bellevue

    Redmond

    Redmond

    Kirkland

    Kirkland

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

  3. Wenn Sie sich diese Ergebnisse ansehen, sehen Sie möglicherweise nicht viel Wert. Erweitern Sie die Abfrage jedoch und wandeln Sie sie mit dem folgenden SQL in eine Union-Abfrage um:

      SELECT Mitarbeiter.Stadt, Mitarbeiter.Stadt AS Filter  VON Mitarbeitern    UNION    SELECT "<All>", "*" AS Filter  VON Mitarbeitern    ORDER NACH Stadt; 
  4. Wechseln Sie zur Datenblattansicht und Sie sollten die folgenden Ergebnisse sehen:

    Stadt

    Filter

    <Alle>

    *

    Bellevue

    Bellevue

    Kirkland

    Kirkland

    Redmond

    Redmond

    Seattle

    Seattle

    Access führt eine Vereinigung der zuvor gezeigten neun Datensätze mit festen Feldwerten von <All> und "*" durch.

    Da diese Union-Klausel UNION ALL nicht enthält, gibt Access nur unterschiedliche Datensätze zurück, was bedeutet, dass jede Stadt nur einmal mit festen identischen Werten zurückgegeben wird.

  5. Da Sie nun über eine fertige Union-Abfrage verfügen, die jeden Städtenamen 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 spezifische Beispiel als Modell verwenden, könnten Sie ein Kombinationsfeld-Steuerelement in einem Formular erstellen, diese Abfrage als Datensatzquelle festlegen, die Eigenschaft „Spaltenbreite" der Spalte „Filter" auf 0 (Null) festlegen, um sie visuell auszublenden, und dann die Gebundene Column-Eigenschaft auf 1, 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 zu aktivieren, der den Wert dessen verwendet, was im Kombinationsfeld-Steuerelement ausgewählt wurde:

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

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

Seitenanfang

No comments:

Post a Comment