Manchmal möchten Sie die Ergebnisse einer Abfrage als Feld in einer anderen Abfrage oder als Kriterium für ein Abfragefeld verwenden. Angenommen, Sie möchten das Intervall zwischen den Bestellungen für jedes Ihrer Produkte sehen. Um eine Abfrage zu erstellen, die dieses Intervall zeigt, müssen Sie jedes Bestelldatum mit anderen Bestelldaten für dieses Produkt vergleichen. Für den Vergleich dieser Bestelldaten ist auch eine Abfrage erforderlich. Sie können diese Abfrage in der Hauptabfrage schachteln, indem Sie eine Unterabfrage.

Sie können eine Unterabfrage in einem Ausdruck oder in einer strukturierte Abfragesprache (SQL) anweisung in SQL-Ansicht.

Inhalt dieses Artikels

Verwenden der Ergebnisse einer Abfrage als Feld in einer anderen Abfrage

Sie können eine Unterabfrage als Feldalias verwenden. Verwenden Sie eine Unterabfrage als Feldalias, wenn Sie die Ergebnisse der Unterabfrage als Feld in der Hauptabfrage verwenden möchten.

Hinweis: Eine Unterabfrage, die Sie als Feldalias verwenden, kann nicht mehr als ein Feld zurückgeben.

Sie können einen Unterabfragefeldalias zum Anzeigen von Werten verwenden, die von anderen Werten in der aktuellen Zeile abhängig sind, was ohne Verwendung einer Unterabfrage nicht möglich ist.

Kehren wir z. B. zu dem Beispiel zurück, in dem Sie das Intervall zwischen den Bestellungen für jedes Ihrer Produkte sehen möchten. Um dieses Intervall zu ermitteln, müssen Sie jedes Bestelldatum mit anderen Bestelldaten für dieses Produkt vergleichen. Sie können eine Abfrage erstellen, in der diese Informationen angezeigt werden, indem Sie die Northwind-Datenbankvorlage verwenden.

  1. Klicken Sie auf der Registerkarte Datei auf Neu.

  2. Klicken Sie unter Verfügbare Vorlagenauf Beispielvorlagen.

  3. Klicken Sie auf Nordwind, und klicken Sie dann auf Erstellen.

  4. Befolgen Sie die Anweisungen auf der Seite Northwind Traders (auf der Objektregisterkarte Startbildschirm), um die Datenbank zu öffnen. Schließen Sie dann das Fenster Anmelde-Dialog.

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

  6. Klicken Sie auf die Registerkarte Abfragen, und doppelklicken Sie dann auf Produktbestellungen.

  7. Doppelklicken Sie auf das Feld "Produkt-ID" und das Feld "Bestelldatum", um sie dem Abfrageentwurfsraster hinzuzufügen.

  8. Wählen Sie in der Zeile Sortieren der Spalte Produkt-ID des Rasters Aufsteigend aus.

  9. Wählen Sie in der Zeile Sortieren der Spalte Bestelldatum des Rasters Absteigend aus.

  10. Klicken Sie in der dritten Spalte des Rasters mit der rechten Maustaste auf die Zeile Feld, und klicken Sie dann im Kontextmenü auf Zoom.

  11. Geben Sie im Dialogfeld Zoom den folgenden Ausdruck ein, oder fügen Sie ihn ein:

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

    Dieser Ausdruck ist die Unterabfrage. Für jede Zeile wählt die Unterabfrage das neueste Bestelldatum aus, das kleiner als das Bestelldatum ist, das der Zeile bereits zugeordnet ist. Beachten Sie, wie Sie das Schlüsselwort AS zum Erstellen eines Tabellenalias verwenden, damit Sie Werte in der Unterabfrage mit Werten in der aktuellen Zeile der Hauptabfrage vergleichen können.

  12. Geben Sie in der vierten Spalte des Rasters in der Zeile Feld den folgenden Ausdruck ein:

    Interval: [Order Date]-[Prior Date]

    Dieser Ausdruck berechnet das Intervall zwischen jedem Bestelldatum und dem vorherigen Bestelldatum für dieses Produkt unter Verwendung des Werts für das Vorherige Datum, den wir mithilfe einer Unterabfrage definiert haben.

  13. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen.

    1. Die Abfrage wird ausgeführt und zeigt eine Liste mit Produktnamen, Bestelldaten, vorherigen Bestelldaten und dem Intervall zwischen den Bestelldaten an. Die Ergebnisse werden zuerst nach Produkt-ID (in aufsteigender Reihenfolge) und dann nach Bestelldatum (in absteigender Reihenfolge) sortiert.

    2. Hinweis: Da die Produkt-ID standardmäßig ein Nachschlagefeld ist, zeigt Access die Nachschlagewerte (in diesem Fall den Produktnamen) anstelle der tatsächlichen Produkt-IDs an. Dadurch werden zwar die angezeigten Werte geändert, die Sortierreihenfolge wird dadurch jedoch nicht geändert.

  14. Schließen Sie die Northwind-Datenbank.

Seitenanfang

Verwenden einer Unterabfrage als Kriterium für ein Abfragefeld

Sie können eine Unterabfrage als Feldkriterium verwenden. Verwenden Sie eine Unterabfrage als Feldkriterium, wenn Sie die Ergebnisse der Unterabfrage verwenden möchten, um die im Feld angezeigten Werte zu beschränken.

Angenommen, Sie möchten eine Liste der Aufträge überprüfen, die von Mitarbeitern verarbeitet wurden, die keine Vertriebsmitarbeiter sind. Zum Generieren dieser Liste müssen Sie die Mitarbeiter-ID für jeden Auftrag mit einer Liste der Mitarbeiter-IDs für Mitarbeiter vergleichen, die keine Vertriebsmitarbeiter sind. Um diese Liste zu erstellen und als Feldkriterium zu verwenden, verwenden Sie eine Unterabfrage, wie im folgenden Verfahren gezeigt:

  1. Öffnen Sie Northwind.accdb, und aktivieren Sie dessen Inhalt.

  2. Schließen Sie das Anmeldeformular.

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

  4. Doppelklicken Sie auf der Registerkarte Tabellen auf Bestellungen und Mitarbeiter.

  5. Doppelklicken Sie in der Tabelle Bestellungen auf das Feld Mitarbeiter-ID, das Feld "Auftrags-ID" und das Feld "Bestelldatum", um sie dem Abfrageentwurfsraster hinzuzufügen. Doppelklicken Sie in der Tabelle Mitarbeiter auf das Feld Auftragstitel, um es dem Entwurfsbereich hinzuzufügen.

  6. Klicken Sie mit der rechten Maustaste auf die Zeile Kriterien in der Spalte Mitarbeiter-ID, und klicken Sie dann im Kontextmenü auf Zoom.

  7. Geben Sie im Feld Zoom den folgenden Ausdruck ein, oder fügen Sie ihn ein:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    Dies ist die Unterabfrage. Er wählt alle Mitarbeiter-IDs aus, bei denen der Mitarbeiter nicht über den Titel "Vertriebsmitarbeiter" verfügt, und stellt dieses Ergebnis für die Hauptabfrage zur Auswahl. Die Hauptabfrage überprüft dann, ob Mitarbeiter-IDs aus der Tabelle "Orders" im Ergebnissatz sind.

  8. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen.

    Die Abfrage wird ausgeführt, und die Abfrageergebnisse zeigen eine Liste der Aufträge an, die von Mitarbeitern verarbeitet wurden, die keine Vertriebsmitarbeiter sind.

Seitenanfang

Allgemeine SQL, die Sie mit einer Unterabfrage verwenden können

Es gibt mehrere SQL Schlüsselwörter, die Sie mit einer Unterabfrage verwenden können:

Hinweis: Diese Liste ist nicht vollständig. Sie können ein beliebiges gültiges SQL in einer Unterabfrage verwenden, mit Ausnahme von Schlüsselwörtern für die Datendefinition.

  • ALLE    Verwenden Sie ALLE in einer WHERE-Klausel, um Zeilen abzurufen, die die Bedingung erfüllen, im Vergleich zu jeder Zeile, die von der Unterabfrage zurückgegeben wird.

    Nehmen wir beispielsweise an, Sie analysieren Schülerdaten an einem College. Die Kursteilnehmer müssen ein Mindestmaß an GPA beibehalten, das von Haupt- bis Hauptschüler unterschiedlich ist. Majors und deren Mindest-GPAs werden in einer Tabelle mit dem Namen Majors gespeichert, und die relevanten Kursteilnehmerinformationen werden in einer Tabelle mit dem Namen Student_Records.

    Sie können die folgende Abfrage verwenden, um eine Liste der Majors (und deren Mindest-GPAs) zu sehen, für die jeder Kursteilnehmer mit diesem Major das Mindest-GPA überschreitet:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY     Verwenden Sie ANY in einer WHERE-Klausel, um Zeilen abzurufen, die die Bedingung im Vergleich zu mindestens einer der von der Unterabfrage zurückgegebenen Zeilen erfüllen.

    Nehmen wir beispielsweise an, Sie analysieren Schülerdaten an einem College. Die Kursteilnehmer müssen ein Mindestmaß an GPA beibehalten, das von Haupt- bis Hauptschüler unterschiedlich ist. Majors und deren Mindest-GPAs werden in einer Tabelle mit dem Namen Majors gespeichert, und die relevanten Kursteilnehmerinformationen werden in einer Tabelle mit dem Namen Student_Records.

    Sie können die folgende Abfrage verwenden, um eine Liste der Majors (und deren Mindest-GPAs) zu sehen, für die jeder Kursteilnehmer mit diesem Major nicht das Mindest-GPA erfüllt:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Hinweis: Sie können auch das Schlüsselwort "SOME" für denselben Zweck verwenden. das Schlüsselwort SOME steht für ANY.

  • EXISTS     Verwenden Sie EXISTS in einer WHERE-Klausel, um anzugeben, dass eine Unterabfrage mindestens eine Zeile zurückgeben soll. Sie können auch MIT NICHT vorworten, um anzugeben, dass eine Unterabfrage keine Zeilen zurückgeben soll.

    Die folgende Abfrage gibt z. B. eine Liste der Produkte zurück, die in mindestens einer vorhandenen Bestellung gefunden wurden:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    Mit NOT EXISTS gibt die Abfrage eine Liste der Produkte zurück, die in mindestens einer vorhandenen Bestellung nicht gefunden werden:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN    Verwenden Sie IN in einer WHERE-Klausel, um zu überprüfen, ob ein Wert in der aktuellen Zeile der Hauptabfrage Teil des Von der Unterabfrage zurückgegebenen Satzs ist. Sie können auch IN mit NOT vorbeschriften, um zu überprüfen, ob ein Wert in der aktuellen Zeile der Hauptabfrage nicht Teil des Von der Unterabfrage zurückgegebenen Satzs ist.

    Die folgende Abfrage gibt z. B. eine Liste der Bestellungen (mit Bestelldaten) zurück, die von Mitarbeitern verarbeitet wurden, die keine Vertriebsmitarbeiter sind:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    Wenn Sie NOT IN verwenden, könnten Sie dieselbe Abfrage auf diese Weise schreiben:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

Seitenanfang

Benötigen Sie weitere Hilfe?

Ihre Office-Fähigkeiten erweitern
Schulungen erkunden
Neue Funktionen als Erster erhalten
Microsoft Office Insidern beitreten

War diese Information hilfreich?

Wie zufrieden sind Sie mit der Übersetzungsqualität?
Was hat Ihre Erfahrung beeinflusst?

Vielen Dank für Ihr Feedback!

×