Sunday, September 18, 2022

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

Manchmal möchten Sie die Ergebnisse einer Abfrage möglicherweise 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 anzeigen. Um eine Abfrage zu erstellen, die dieses Intervall anzeigt, müssen Sie jedes Bestelldatum mit anderen Bestelldaten für dieses Produkt vergleichen. Der Vergleich dieser Bestelldaten erfordert ebenfalls eine Abfrage. Sie können diese Abfrage innerhalb Ihrer Hauptabfrage verschachteln, indem Sie eine Unterabfrage verwenden.

Sie können eine Unterabfrage in einem Ausdruck oder in einer SQL-Anweisung (Structured Query Language) in der SQL-Ansicht schreiben.

In diesem Artikel

Verwenden Sie die 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 Ihrer Hauptabfrage verwenden möchten.

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

Sie können einen Alias ​​für ein Unterabfragefeld verwenden, um Werte anzuzeigen, die von anderen Werten in der aktuellen Zeile abhängen, was ohne die Verwendung einer Unterabfrage nicht möglich ist.

Lassen Sie uns zum Beispiel zu dem Beispiel zurückkehren, in dem Sie das Intervall zwischen den Bestellungen für jedes Ihrer Produkte sehen möchten. Um dieses Intervall zu bestimmen, müssen Sie jedes Bestelldatum mit anderen Bestelldaten für dieses Produkt vergleichen. Sie können eine Abfrage erstellen, die diese Informationen anzeigt, indem Sie die Northwind-Datenbankvorlage verwenden.

  1. Klicken Sie auf der Registerkarte Datei auf Neu .

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

  3. Klicken Sie auf Northwind und dann auf Erstellen .

  4. Befolgen Sie die Anweisungen auf der Seite Northwind Traders (auf der Objektregisterkarte Startbildschirm ), um die Datenbank zu öffnen, und schließen Sie dann das Anmeldedialogfenster.

  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 Abfrageentwurfsbereich 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 oder fügen Sie im Dialogfeld „ Zoom " den folgenden Ausdruck ein:

     Vorheriges Datum: (SELECT MAX([Bestelldatum])
    VON [Produktbestellungen] WIE [Alte Bestellungen]
    WO [Alte Bestellungen].[Bestelldatum] < [Produktbestellungen].[Bestelldatum]
    UND [Alte Bestellungen].[Produkt-ID] = [Produktbestellungen].[Produkt-ID])

    Dieser Ausdruck ist die Unterabfrage. Für jede Zeile wählt die Unterabfrage das jüngste Bestelldatum aus, das jünger ist als das Bestelldatum, das der Zeile bereits zugeordnet ist. Beachten Sie, wie Sie mit dem Schlüsselwort AS einen Tabellenalias erstellen, sodass 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:

    Intervall: [Bestelldatum]-[Vorheriges Datum]

    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, das 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, früheren Bestelldaten und dem Intervall zwischen 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 ein Nachschlagefeld ist, zeigt Access standardmäßig die Nachschlagewerte (in diesem Fall den Produktnamen) und nicht die eigentlichen Produkt-IDs an. Obwohl dies die angezeigten Werte ändert, ändert es nicht die Sortierreihenfolge.

  14. Schließen Sie die Northwind-Datenbank.

Seitenanfang

Verwenden Sie eine 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 Werte einzuschränken, die das Feld anzeigt.

Angenommen, Sie möchten eine Liste mit Bestellungen überprüfen, die von Mitarbeitern bearbeitet wurden, die keine Vertriebsmitarbeiter sind. Um diese Liste zu erstellen, müssen Sie die Mitarbeiter-ID für jeden Auftrag mit einer Liste der Mitarbeiter-IDs von Mitarbeitern vergleichen, die keine Handelsvertreter 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 seinen Inhalt.

  2. Schließen Sie das Anmeldeformular.

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

  4. Doppelklicken Sie auf der Registerkarte Tabellen auf Aufträge und Mitarbeiter .

  5. Doppelklicken Sie in der Tabelle Bestellungen auf das Feld Mitarbeiter-ID , das Feld Bestell - ID und das Feld Bestelldatum, um sie dem Abfrageentwurfsbereich hinzuzufügen. Doppelklicken Sie in der Tabelle "Employees" auf das Feld Job Title , um es dem Entwurfsbereich hinzuzufügen.

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

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

     IN (WÄHLE [ID] VON [Mitarbeitern]
    WHERE [Berufsbezeichnung]<>'Vertriebsmitarbeiter')

    Dies ist die Unterabfrage. Es wählt alle Mitarbeiter-IDs aus, bei denen der Mitarbeiter keine Berufsbezeichnung eines Vertriebsmitarbeiters hat, und liefert diese Ergebnismenge an die Hauptabfrage. Die Hauptabfrage prüft dann, ob Mitarbeiter-IDs aus der Tabelle „Bestellungen" in der Ergebnismenge enthalten 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 mit Bestellungen, die von Mitarbeitern bearbeitet wurden, die keine Vertriebsmitarbeiter sind.

Seitenanfang

Allgemeine SQL-Schlüsselwörter, 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 jedes gültige SQL-Schlüsselwort in einer Unterabfrage verwenden, mit Ausnahme von Datendefinitionsschlüsselwörtern.

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

    Angenommen, Sie analysieren Studentendaten an einer Hochschule. Die Studenten müssen einen Mindest-GPA einhalten, der von Hauptfach zu Hauptfach unterschiedlich ist. Majors und ihre Mindest-GPAs werden in einer Tabelle namens Majors gespeichert, und die relevanten Studenteninformationen werden in einer Tabelle namens Student_Records gespeichert.

    Um eine Liste der Hauptfächer (und ihrer Mindest-GPAs) anzuzeigen, für die jeder Student mit diesem Hauptfach das Mindest-GPA überschreitet, können Sie die folgende Abfrage verwenden:

     WÄHLE [Major], [Min_GPA]
    VON [Majors]
    WO [Min_GPA] < ALLE
    (WÄHLE [GPA] AUS [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY Verwenden Sie ANY in einer WHERE-Klausel, um Zeilen abzurufen, die die Bedingung erfüllen, wenn sie mit mindestens einer der von der Unterabfrage zurückgegebenen Zeilen verglichen werden.

    Angenommen, Sie analysieren Studentendaten an einer Hochschule. Die Studenten müssen einen Mindest-GPA einhalten, der von Hauptfach zu Hauptfach unterschiedlich ist. Majors und ihre Mindest-GPAs werden in einer Tabelle namens Majors gespeichert, und die relevanten Studenteninformationen werden in einer Tabelle namens Student_Records gespeichert.

    Um eine Liste der Hauptfächer (und ihrer Mindestnotendurchschnittsnoten) anzuzeigen, für die ein Student mit diesem Hauptfach die Mindestnotendurchschnittsnote nicht erfüllt, können Sie die folgende Abfrage verwenden:

     WÄHLE [Major], [Min_GPA]
    VON [Majors]
    WHERE [Min_GPA] > ALLE
    (WÄHLE [GPA] AUS [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Hinweis: Sie können für denselben Zweck auch das Schlüsselwort SOME verwenden; das Schlüsselwort SOME ist synonym mit ANY.

  • EXISTS Verwenden Sie 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 eine Unterabfrage keine Zeilen zurückgeben soll.

    Die folgende Abfrage gibt beispielsweise eine Liste von Produkten zurück, die in mindestens einer bestehenden Bestellung gefunden werden:

     AUSWÄHLEN *
    VON [Produkte]
    WO VORHANDEN
    (AUSWÄHLEN * AUS [Bestelldetails]
    WHERE [Bestelldetails].[Produkt-ID]=[Produkte].[ID]);

    Unter Verwendung von NOT EXISTS gibt die Abfrage eine Liste von Produkten zurück, die in mindestens einer bestehenden Bestellung nicht gefunden werden:

     AUSWÄHLEN *
    VON [Produkte]
    WO NICHT EXISTIERT
    (AUSWÄHLEN * AUS [Bestelldetails]
    WHERE [Bestelldetails].[Produkt-ID]=[Produkte].[ID]);
  • IN Verwenden Sie IN in einer WHERE-Klausel, um zu überprüfen, ob ein Wert in der aktuellen Zeile der Hauptabfrage Teil des Satzes ist, den die Unterabfrage zurückgibt. Sie können IN auch NOT voranstellen, um sicherzustellen, dass ein Wert in der aktuellen Zeile der Hauptabfrage nicht Teil des Satzes ist, den die Unterabfrage zurückgibt.

    Die folgende Abfrage gibt beispielsweise eine Liste von Bestellungen (mit Bestelldaten) zurück, die von Mitarbeitern bearbeitet wurden, die keine Vertriebsmitarbeiter sind:

     WÄHLEN Sie [Bestell-ID], [Bestelldatum]
    VON [Bestellungen]
    WO [Mitarbeiter-ID] IN
    (Wählen Sie [ID] VON [Mitarbeitern]
    WHERE [Berufsbezeichnung]<>'Vertriebsmitarbeiter');

    Durch die Verwendung von NOT IN könnten Sie dieselbe Abfrage folgendermaßen schreiben:

     WÄHLEN Sie [Bestell-ID], [Bestelldatum]
    VON [Bestellungen]
    WO [Mitarbeiter-ID] NICHT IN
    (Wählen Sie [ID] VON [Mitarbeitern]
    WHERE [Job Title]='Vertriebsmitarbeiter');

Seitenanfang

No comments:

Post a Comment