Verschachtelung einer Abfrage innerhalb einer anderen Abfrage oder in einem Ausdruck mit Hilfe einer Unterabfrage

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 <token>TE000126768</token> verwenden.

Unterabfragen können in einem <token>TE000127167</token> oder in einer SQL-Anweisung (Structured Query Language) in der <token>TE000126761</token> geschrieben werden.

Inhalt dieses Artikels

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">Verwenden der Ergebnisse einer Abfrage als Feld in einer anderen Abfrage</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">Verwenden einer Unterabfrage als Kriterium für ein Abfragefeld</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">Allgemeine SQL-Schlüsselwörter, die in Verbindung mit Unterabfragen verwendet werden können</link>

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

  1. Wählen Sie auf der Registerkarte <ui>Datei</ui> die Option <ui>Neu</ui> aus.

  2. Klicken Sie unter <ui>Verfügbare Vorlagen</ui> auf <ui>Beispielvorlagen</ui>.

  3. Klicken Sie auf <ui>Nordwind</ui> und anschließend auf <ui>Erstellen</ui>.

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

  5. Klicken Sie auf der Registerkarte <ui>Erstellen</ui> in der Gruppe <ui>Abfragen</ui> auf <ui>Abfrageentwurf</ui>.

  6. Klicken Sie im Dialogfeld <ui>Tabelle anzeigen</ui> auf die Registerkarte <ui>Abfragen</ui>, und doppelklicken Sie dann auf <ui>Artikelbestellungen</ui>.

  7. Schließen Sie das Dialogfeld <ui>Tabelle anzeigen</ui>.

  8. Doppelklicken Sie auf das Feld <ui>Bestell-Nr</ui> und das Feld <ui>Bestelldatum</ui>, um diese dem Abfrageentwurfsbereich hinzuzufügen.

  9. Wählen Sie in der Zeile <ui>Sortieren</ui> der Spalte <ui>Bestell-Nr</ui> des Rasters <ui>Aufsteigend</ui> aus.

  10. Wählen Sie in der Zeile <ui>Sortieren</ui> der Spalte <ui>Bestelldatum</ui> des Rasters <ui>Absteigend</ui> aus.

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

  12. Geben Sie im Feld <ui>Zoom</ui> 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.

  13. Geben Sie in der vierten Spalte des Rasters in der Zeile <ui>Feld</ui> den folgenden Ausdruck ein:

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

    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.<br />

  14. Klicken Sie auf der Registerkarte <ui>Entwurf</ui>, in der Gruppe <ui>Ergebnisse</ui>, auf <ui>Ausführen</ui>.

    1. Die Abfrage wird durchgeführt und zeigt eine Liste von Produktnamen, Bestellungsdaten, früheren Bestellungsdaten und das Zeitintervall zwischen Bestellungsdaten.Die Ergebnisse werden zuerst nach Produkt-ID (in aufsteigender Reihenfolge) und dann nach Bestellungsdatum (in absteigender Reihenfolge) sortiert.

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

  15. Schließen Sie die Nordwind-Datenbank.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Seitenanfang</link>

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 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 <legacyItalic>keine</legacyItalic> 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 Datenbank „Northwind.accdb“, und aktivieren Sie deren Inhalt.

  2. Schließen Sie das Anmeldeformular.

  3. Klicken Sie auf der Registerkarte <ui>Erstellen</ui> in der Gruppe <ui>Abfragen</ui> auf <ui>Abfrageentwurf</ui>.

  4. Doppelklicken Sie im Dialogfeld <ui>Tabelle anzeigen</ui> auf der Registerkarte <ui>Tabellen</ui> auf <ui>Bestellungen</ui> und <ui>Personal</ui>.

  5. Schließen Sie das Dialogfeld <ui>Tabelle anzeigen</ui>.

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

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

  8. Geben Sie im Feld <ui>Zoom</ui> den folgenden Ausdruck ein:

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

    Dies ist die Unterabfrage.Hiermit werden alle Mitarbeiterkennungen ausgewählt, bei denen der Mitarbeiter nicht die Berufsbezeichnung Vertriebsmitarbeiter hat, und dieses Ergebnis wird der Hauptabfrage zur Verfügung gestellt.Die Hauptanfrage überprüft dann, ob alle Mitarbeiterkennungen aus der Tabelle „Orders“ im Resultset vorhanden sind.

  9. Klicken Sie auf der Registerkarte <ui>Entwurf</ui> in der Gruppe <ui>Ergebnisse</ui> auf <ui>Ausführen</ui>.

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Seitenanfang</link>

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.

  • <embeddedLabel>ALL</embeddedLabel> 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 Sie beispielsweise an, dass Sie Studentendaten an einer Hochschule analysieren.Die Studenten müssen eine minimale Durchschnittsnote einhalten, die von Hauptfach zu Hauptfach variiert.Hauptfächer und deren minimale Durchschnittsnote werden in einer Tabelle namens „Majors“ gespeichert, und die entsprechenden Studenteninformationen werden in einer Tabelle namens „Student_Records“ gespeichert.

    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]);
  • <embeddedLabel>ANY</embeddedLabel> 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 Sie beispielsweise an, dass Sie Studentendaten an einer Hochschule analysieren.Die Studenten müssen eine minimale Durchschnittsnote einhalten, die von Hauptfach zu Hauptfach variiert.Hauptfächer und deren minimale Durchschnittsnote werden in einer Tabelle namens „Majors“ gespeichert, und die entsprechenden Studenteninformationen werden in einer Tabelle namens „Student_Records“ gespeichert.

    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.

  • <embeddedLabel>EXISTS</embeddedLabel> 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]);
  • <embeddedLabel>IN</embeddedLabel> 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');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Seitenanfang</link>

Ihre Office-Fähigkeiten erweitern
Schulung erkunden
Neue Funktionen als Erster erhalten
An Office Insider teilnehmen

War diese Information hilfreich?

Vielen Dank für Ihr Feedback!

Vielen Dank für Ihr Feedback. Es klingt, als ob es hilfreich sein könnte, Sie mit einem unserer Office-Supportmitarbeiter zu verbinden.

×