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.

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 Feld-Alias verwenden. Sie verwenden eine Unterabfrage als Feldalias, wenn die Ergebnisse der Unterabfrage als Feld in der Hauptabfrage verwendet werden sollen.

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 Bestelldatum mit anderen Bestelldaten des Produkts vergleichen. Sie können eine Abfrage erstellen, die diese Informationen zurückgibt, indem Sie die Northwind 2007-Vorlage verwenden.

Einrichten von Nordwind 2007

  1. Klicken Sie auf die Schaltfläche Microsoft Office Abbildung der Office-Schaltfläche , und klicken Sie dann auf Neu.

  2. Klicken Sie im linken Bereich unter Vorlagenkategorien auf Lokale Vorlagen.

  3. Klicken Sie unter Lokale Vorlagen auf Nordwind 2007 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 Andere auf Abfrageentwurf.

  2. Doppelklicken Sie im Dialogfeld Tabelle anzeigen auf Bestellungen und dann auf Schließen.

  3. Schließen Sie das Dialogfeld Tabelle anzeigen.

  4. Doppelklicken Sie auf das Feld Product ID und das Feld Order Date, um diese dem Abfrageentwurfsbereich hinzuzufügen.

  5. Wählen Sie in der Zeile Sortieren der Spalte Product ID des Rasters Aufsteigend aus.

  6. Wählen Sie in der Zeile Sortieren der Spalte Order Date 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.

  9. 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.

    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 "Product ID" (in aufsteigender Reihenfolge) und dann nach dem Feld "Order Date" (in absteigender Reihenfolge) sortiert.

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

  2. Schließen Sie die Northwind-Datenbank.

Seitenanfang

Verwenden einer Unterabfrage als Kriterium für ein Abfragefeld

Sie können eine Unterabfrage als Feld-Kriterium verwenden. Sie verwenden eine Unterabfrage als Feldkriterium, wenn Sie das Ergebnis der Abfrage zum Beschränken der Werte verwenden möchten, die im Feld angezeigt werden.

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 Mitarbeiterkennung 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 "Northwind 2007.accdb", und aktivieren Sie den Inhalt.

  2. Schließen Sie das Anmeldeformular.

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

  4. Doppelklicken Sie im Dialogfeld Tabelle anzeigen auf der Registerkarte Tabellen auf Orders und Employees.

  5. Schließen Sie das Dialogfeld Tabelle anzeigen.

  6. Doppelklicken Sie in der Tabelle "Orders" auf das Feld Employee ID, das Feld Order ID und das Feld Order Date, um diese dem Abfrageentwurfsbereich hinzuzufügen. Doppelklicken Sie in der Tabelle "Employees" auf das Feld Job Title, um dieses Feld dem Abfrageentwurfsbereich hinzuzufügen.

  7. Klicken Sie mit der rechten Maustaste auf die Zeile Kriterien der Spalte "Employee ID", 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 Mitarbeiterkennungen (Employee IDs) von Mitarbeitern ausgewählt, die nicht unter der Position "Sales Representative" (Vertriebsmitarbeiter) geführt werden, und das Ergebnisset wird an die Hauptabfrage zurückgegeben. Mit der Hauptabfrage wird dann geprüft, ob sich Mitarbeiterkennungen aus der Tabelle "Orders" 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 jede 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) erreichen, die von Hauptfach zu Hauptfach variiert. Die Hauptfächer und die zugehörigen minimalen Durchschnittsnoten werden in einer Tabelle mit der Bezeichnung "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), 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 Aufträge (mit Auftragsdaten) 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!

×