Verschachteln einer Abfrage in einer anderen Abfrage oder in einem Ausdruck mithilfe einer Unterabfrage

Wichtig :  Dieser Artikel wurde maschinell übersetzt. Bitte beachten Sie den Haftungsausschluss. Die englische Version des Artikels ist als Referenz hier verfügbar: hier.

Es kann vorkommen, dass Sie die Ergebnisse einer Abfrage als Feld in einer anderen Abfrage oder als Kriterium für ein Abfragefeld verwenden möchten. Nehmen wir beispielsweise einmal an, Sie möchten die Zeiträume zwischen den Bestellungen eines jeden Produkts anzeigen. Zum Erstellen einer Abfrage, die diese Zeiträume anzeigt, müssen Sie die einzelnen Bestelldaten mit anderen Bestelldaten des jeweiligen Produkts vergleichen. Für den Vergleich dieser Bestelldaten ist ebenfalls eine Abfrage erforderlich. Sie können diese Abfrage in die Hauptabfrage verschachteln, indem Sie eine Unterabfrage verwenden.

Unterabfragen können in einem Ausdruck oder in einer SQL-Anweisung (Structured Query Language) in der SQL-Ansicht geschrieben werden.

Hinweis :  Dieser Artikel gilt nicht für Access-Apps, d. h. der neuen Art von Datenbanken, die Sie mit Access entwerfen und online veröffentlichen. Weitere Informationen finden Sie unter Erstellen einer Access-App.

Inhalt dieses Artikels

Verwenden der Ergebnisse einer Abfrage als Feld in einer anderen Abfrage

Verwenden einer Unterabfrage als Kriterium für ein Abfragefeld

Allgemeine SQL-Schlüsselwörter, die in Verbindung mit Unterabfragen verwendet werden können

Verwenden der Ergebnisse einer Abfrage als Feld in einer anderen Abfrage

Sie können eine Unterabfrage als Feldalias verwenden. Verwenden einer Unterabfrage als Feldalias an, wenn Sie die Ergebnisse der Unterabfrage als Feld in Ihrer Abfrage Hauptfenster verwenden möchten.

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

Sie können eine Unterabfrage als Feldalias verwenden, um Werte anzuzeigen, die von anderen Werten in der aktuellen Zeile abhängig sind, was ohne eine Unterabfrage nicht möglich ist.

Lassen Sie uns zu dem Beispiel zurückkehren, in dem die Zeiträume zwischen den Bestelldaten eines jeden Produkts angezeigt werden sollen. Zur Ermittlung dieser Zeiträume müssen Sie das jeweilige Auftragsdatum mit anderen Bestelldaten des Produkts vergleichen. Sie können eine Abfrage erstellen, die diese Informationen zurückgibt, indem Sie die Nordwind-Datenbank verwenden.

Einrichten von Nordwind

  1. Wählen Sie auf der Registerkarte Datei die Option Neu aus.

  2. Klicken Sie unter Verfügbare Vorlagen auf Beispielvorlagen.

  3. Klicken Sie auf Nordwind und anschließend 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.

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

  2. Klicken Sie im Dialogfeld Tabelle anzeigen auf die Registerkarte Abfragen, und doppelklicken Sie dann auf Artikelbestellungen.

  3. Schließen Sie das Dialogfeld Tabelle anzeigen.

  4. Doppelklicken Sie auf das Feld Bestell-Nr und das Feld Bestelldatum, um diese dem Abfrageentwurfsbereich hinzuzufügen.

  5. Wählen Sie in der Zeile Sortieren der Spalte Bestell-Nr des Rasters Aufsteigend aus.

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

  7. Klicken Sie in der dritten Spalte des Entwurfsbereichs mit der rechten Maustaste auf die Zeile Feld und anschließend im Kontextmenü auf Zoom.

  8. Geben Sie im Feld Zoom den folgenden Ausdruck 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. Mit der Unterabfrage wird für jede Zeile das letzte Bestelldatum ausgewählt, das älter als das bereits der Zeile zugeordnete Bestelldatum ist. Beachten Sie, wie das Schlüsselwort AS für die Erstellung eines Tabellenalias verwendet wird, damit Sie die Werte in der Unterabfrage mit den Werten in der aktuellen Zeile der Hauptabfrage vergleichen können.

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

    Interval: [Order Date]-[Prior Date]

Mit diesem Ausdruck wird der Zeitraum zwischen dem jeweiligen Bestelldatum und dem vorherigen Bestelldatum des Produkts berechnet, und zwar unter Verwendung des Werts für das vorherige Datum, der mithilfe der Unterabfrage festgelegt wurde.

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

    1. Die Abfrage wird ausgeführt, und es wird eine Liste der Produktnamen, Bestelldaten, vorherigen Bestelldaten sowie der Zeiträume zwischen den Bestelldaten angezeigt. Das Ergebnis wird zuerst nach dem Feld Bestell-Nr (in aufsteigender Reihenfolge) und dann nach dem Feld Bestelldatum (in absteigender Reihenfolge) sortiert.

    2. Hinweis : Da es sich bei Bestell-Nr um ein Nachschlagefeld handelt, zeigt Access die Nachschlagewerte (in dem Fall den Produktnamen) anstelle der eigentlichen Produkt-IDs (Bestellnummern) an. Obwohl hiermit die angezeigten Werte geändert werden, hat dies keinen Einfluss auf die Sortierreihenfolge.

  2. Schließen Sie die Nordwind-Datenbank.

Seitenanfang

Verwenden einer Unterabfrage als Kriterium für ein Abfragefeld

Sie können eine Unterabfrage als Kriterium Feld verwenden. Verwenden einer Unterabfrage als Kriterium Feld ein, wenn die Ergebnisse der Unterabfrage verwenden, die Werte einschränken, die im Feld angezeigt werden soll.

Nehmen wir beispielsweise einmal an, Sie möchten eine Liste der Aufträge anzeigen, die von Mitarbeitern bearbeitet wurden, die keine Vertriebsmitarbeiter sind. Zum Generieren dieser Liste müssen Sie die Mitarbeiter-ID eines jeden Auftrags mit der Liste der Kennungen der Mitarbeiter vergleichen, die keine Vertriebsmitarbeiter sind. Zum Erstellen dieser Liste und zur Verwendung der Liste als Feldkriterium verwenden Sie wie im nachstehenden Verfahren gezeigt eine Unterabfrage:

  1. Öffnen Sie die Nordwind-Datenbank, und aktivieren Sie deren Inhalt.

  2. Schließen Sie das Anmeldeformular.

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

  4. Doppelklicken Sie im Dialogfeld Tabelle anzeigen auf der Registerkarte Tabellen auf Bestellungen und Personal.

  5. Schließen Sie das Dialogfeld Tabelle anzeigen.

  6. Doppelklicken Sie in der Tabelle Bestellungen auf das Feld Personal-Nr, das Feld Bestell-Nr und das Feld Bestelldatum, um diese dem Abfrageentwurfsbereich hinzuzufügen. Doppelklicken Sie in der Tabelle Personal auf das Feld Position, um dieses Feld dem Abfrageentwurfsbereich hinzuzufügen.

  7. Klicken Sie mit der rechten Maustaste auf die Zeile Kriterien der Spalte Personal-Nr, und klicken Sie dann im Kontextmenü auf Zoom.

  8. Geben Sie im Feld Zoom den folgenden Ausdruck ein:

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

    Dies ist die Unterabfrage. Hiermit werden sämtliche Personalnummern von Mitarbeitern ausgewählt, die nicht unter der Position "Vertriebsmitarbeiter" geführt werden, und das Ergebnisset wird an die Hauptabfrage zurückgegeben. Mit der Hauptabfrage wird dann geprüft, ob sich Personalnummern aus der Tabelle Bestellungen im Ergebnisset befinden.

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

    Die Abfrage wird ausgeführt, und als Abfrageergebnis wird eine Liste der Aufträge angezeigt, die von Mitarbeiter verarbeitet wurden, die keine Vertriebsmitarbeiter sind.

Seitenanfang

Allgemeine SQL-Schlüsselwörter, die in Verbindung mit Unterabfragen verwendet werden können

Es gibt verschiedene SQL-Schlüsselwörter, die in Verbindung mit Unterabfragen verwendet werden können:

Hinweis : Diese Liste erhebt keinen Anspruch auf Vollständigkeit. In einer Unterabfrage kann jedes gültige SQL-Schlüsselwort mit Ausnahme von Schlüsselwörtern für die Datendefinition verwendet werden.

  • ALL    Sie verwenden ALL in einer WHERE-Klausel, um Zeilen abzurufen, die der Bedingung entsprechen, wenn sie mit jeder von der Unterabfrage zurückgegebenen Zeile verglichen werden.

    Nehmen wir beispielsweise einmal an, Sie analysieren die Daten der Studierenden an einer Hochschule. Jeder Studierende muss eine minimale Durchschnittsnote (GPA, Grade Point Average) erzielen, die von Hauptfach zu Hauptfach variiert. Die Hauptfächer und die zugehörigen minimalen Durchschnittsnoten werden in einer Tabelle mit der Bezeichnung erreichen Majors (Hauptfächer) gespeichert, und die relevanten Daten der Studierenden sind in einer Tabelle mit Namen Student_Records (Daten_Studierende) abgelegt.

    Zum Anzeigen einer Liste der Hauptfächer (und der zugehörigen minimalen Durchschnittsnoten), bei denen der jeweilige Studierende mit diesem Hauptfach über der minimalen Durchschnittsnote liegt, kann die folgende Abfrage verwendet werden:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    Sie verwenden ANY in einer WHERE-Klausel, um Zeilen abzurufen, die der Bedingung entsprechen, wenn sie mit mindestens einer von der Unterabfrage zurückgegebenen Zeile verglichen werden.

    Nehmen wir beispielsweise einmal an, Sie analysieren die Daten der Studierenden an einer Hochschule. Jeder Studierende muss eine minimale Durchschnittsnote (GPA, Grade Point Average) erzielen, die von Hauptfach zu Hauptfach variiert. Die Hauptfächer und die zugehörigen minimalen Durchschnittsnoten werden in einer Tabelle mit der Bezeichnung erreichen Majors (Hauptfächer) gespeichert, und die relevanten Daten der Studierenden sind in einer Tabelle mit Namen Student_Records (Daten_Studierende) abgelegt.

    Zum Anzeigen einer Liste der Hauptfächer (und der zugehörigen minimalen Durchschnittsnoten), bei denen irgendeiner der Studierenden mit diesem Hauptfach unter der minimalen Durchschnittsnote liegt, kann die folgende Abfrage verwendet werden:

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

    Hinweis : Für den gleichen Zweck kann auch das Schlüsselwort SOME verwendet werden; das Schlüsselwort SOME wird synonym zum Schlüsselwort ANY verwendet.

  • EXISTS    Sie verwenden EXISTS in einer WHERE-Klausel, um anzugeben, dass eine Unterabfrage mindestens eine Zeile zurückgeben soll. Sie können EXISTS auch NOT voranstellen, um anzugeben, dass die Unterabfrage keine Zeilen zurückgeben soll.

    Mit der folgenden Abfrage wird beispielsweise eine Liste der Produkte zurückgegeben, die sich in mindestens einem vorhandenen Auftrag befinden:

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

    Bei Verwendung von NOT EXISTS wird eine Liste der Produkte zurückgegeben, die sich nicht in mindestens einem vorhandenen Auftrag befinden:

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

    So gibt die folgende Abfrage beispielsweise 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');

    Bei Verwendung von NOT IN hätte die gleiche Abfrage auch wie folgt geschrieben werden können:

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

Seitenanfang

Hinweis : Haftungsausschluss für maschinelle Übersetzungen: Dieser Artikel wurde mithilfe eines Computersystems und ohne jegliche Bearbeitung durch Personen übersetzt. Microsoft bietet solche maschinellen Übersetzungen als Hilfestellung für Benutzer ohne Englischkenntnisse an, damit Sie von den Informationen zu Produkten, Diensten und Technologien von Microsoft profitieren können. Da es sich bei diesem Artikel um eine maschinelle Übersetzung handelt, enthält er möglicherweise Fehler in Bezug auf (Fach-)Terminologie, Syntax und/oder Grammatik.

Teilen Facebook Facebook Twitter Twitter E-Mail E-Mail

War diese Information hilfreich?

Sehr gut. Noch anderes Feedback?

Was können wir verbessern?

Vielen Dank für Ihr Feedback!

×