Nest een query in een andere query of in een expressie door een subquery te gebruiken

Het kan gebeuren dat u de resultaten van een query als veld in een andere query of als criterium voor een queryveld wilt gebruiken. Stel dat u het interval tussen orders voor elk van uw producten wilt bekijken. Als u een query wilt maken waarmee dit interval wordt opgehaald, moet u elke orderdatum vergelijken met andere datums voor dat product. Voor het vergelijken van deze orderdatums is ook een query nodig. U kunt deze query in de hoofdquery nesten door een <token>TE000126768</token> te gebruiken.

U kunt een subquery in een <token>TE000127167</token> of in een SQL-instructie (Structured Query Language) in de <token>TE000126761</token> schrijven.

In dit artikel

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">gebruik de resultaten van een query als een veld in een andere query</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">gebruik een subquery als criterium voor een queryveld</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">Algemene SQL-sleutelwoorden die u bij een subquery kunt gebruiken</link>

De resultaten van een query als veld in een andere query gebruiken

U kunt een subquery als TE000127237 gebruiken. Dit doet u in gevallen waarin u de subqueryresultaten als veld in de hoofdquery wilt gebruiken.

Opmerking: Met een subquery die u als veldalias gebruikt, kan slechts één veld worden opgehaald.

Met behulp van een subqueryveldalias kunt u waarden weergeven die afhankelijk zijn van andere waarden in de huidige rij, wat niet mogelijk is zonder een subquery.

Stel, uitgaand van het voorbeeld, dat u het interval tussen orders voor elk van uw producten wilt bekijken. Als u dit interval wilt bepalen, moet u elke orderdatum vergelijken met andere datums voor dat product. Met de sjabloon Noordenwind 2007 kunt u een query maken waarmee deze informatie wordt opgehaald.

  1. Klik op het tabblad <ui>Bestand</ui> op <ui>Nieuw</ui>.

  2. Klik onder <ui>Beschikbare sjablonen</ui> op <ui>Voorbeeldsjablonen</ui>.

  3. Klik achtereenvolgens op <ui>Noordenwind</ui> en op <ui>Maken</ui>.

  4. Volg de aanwijzingen op de pagina <ui>Noordenwind BV</ui> (op het objecttabblad van het <ui>opstartscherm</ui>) om de database te openen en sluit vervolgens het aanmeldingsvenster.

  5. Klik op het tabblad <ui>Maken</ui> in de groep <ui>Query's</ui> op <ui>Queryontwerp</ui>.

  6. Klik in het dialoogvenster <ui>Tabel weergeven</ui> op het tabblad <ui>Query's</ui> en dubbelklik op <ui>Productorders</ui>.

  7. Sluit het dialoogvenster <ui>Tabel weergeven</ui>.

  8. Dubbelklik op het veld <ui>Productnummer</ui> en het veld <ui>Orderdatum</ui> om deze velden toe te voegen aan het queryontwerpraster.

  9. Selecteer <ui>Oplopend</ui> in de rij <ui>Sorteren</ui> van de kolom <ui>Productnummer</ui> van het raster.

  10. Selecteer <ui>Aflopend</ui> in de rij <ui>Sorteren</ui> van de kolom <ui>Orderdatum</ui> van het raster.

  11. Klik in de derde kolom van het raster met de rechtermuisknop op de rij <ui>Veld</ui> en klik in het snelmenu op <ui>In- en uitzoomen</ui>.

  12. Typ of plak de volgende expressie in het dialoogvenster <ui>In- en uitzoomen</ui>:

    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])

    Deze expressie is de subquery. De subquery selecteert voor elke rij de meest recente orderdatum die later is dan de orderdatum die reeds aan de rij is gekoppeld. U gebruikt het sleutelwoord AS om een tabelalias te maken zodat u waarden in de subquery kunt vergelijken met waarden in de huidige rij van de hoofdquery.

  13. Typ de volgende expressie in de rij <ui>Veld</ui> in de vierde kolom van het raster:

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

    Deze expressie berekent het interval tussen elke orderdatum en de voorgaande orderdatum voor dat product op basis van de waarde voor de voorgaande datum zoals gedefinieerd door middel van een subquery.<br />

  14. Ga naar het tabblad <ui>Ontwerp </ui> en klik in de groep <ui>Resultaten</ui> op <ui>Uitvoeren</ui>.

    1. De query wordt uitgevoerd, waarna een lijst met productnamen, orderdatums, voorgaande orderdatums en het interval tussen orderdatums wordt opgehaald. De gegevens worden eerst op productnummer gesorteerd (in oplopende volgorde) en vervolgens op orderdatum (in aflopende volgorde).

    2. Opmerking: Aangezien 'Productnummer' een opzoekveld is, worden standaard de opzoekwaarden (in dit geval de productnaam) en niet de werkelijke productnummers weergegeven. Hoewel hierdoor andere waarden worden weergegeven, blijft de sorteervolgorde hetzelfde.

  15. Sluit de database Noordenwind.

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

Een subquery als criterium voor een queryveld gebruiken

U kunt een subquery als veld criteria gebruiken. Dit doet u wanneer u met de subqueryresultaten wilt beperken welke waarden in het veld worden weergegeven.

Stel dat u wilt nagaan welke orders zijn verwerkt door werknemers die <legacyItalic>geen</legacyItalic> vertegenwoordiger zijn. Als u een lijst met deze werknemers wilt genereren, moet u de werknemer-id voor elke order vergelijken met een lijst met id's van werknemers die geen vertegenwoordiger zijn. U kunt deze lijst maken en als veldcriterium gebruiken met behulp van een subquery. Ga hiervoor als volgt te werk:

  1. Open de Northwind.accdb en schakel de inhoud ervan in.

  2. Sluit het aanmeldingsvenster.

  3. Klik op het tabblad <ui>Maken </ui> in de groep <ui>Overige</ui> op <ui>Queryontwerp </ui>.

  4. Open het tabblad <ui>Tabellen</ui> van het dialoogvenster <ui>Tabel weergeven</ui> en dubbelklik op <ui>Orders</ui> en <ui>Werknemers</ui>.

  5. Sluit het dialoogvenster <ui>Tabel weergeven</ui>.

  6. Dubbelklik in de tabel Orders op de velden <ui>Werknemer-id</ui>, <ui>Order-id</ui> en <ui>Orderdatum</ui> om deze velden aan het queryontwerpraster toe te voegen. Dubbelklik in de tabel Werknemers op het veld <ui>Functie</ui> om dit aan het ontwerpraster toe te voegen.

  7. Klik met de rechtermuisknop op de rij <ui>Criteria</ui> van de kolom Werknemer-id en klik in het snelmenu op <ui>In- en uitzoomen</ui>.

  8. Typ of plak de volgende expressie in het dialoogvenster <ui>In- en uitzoomen</ui>:

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

    Dit is de subquery. Met subquery worden alle id's geselecteerd van werknemers die niet de functie Verkoper hebben. Deze resultatenset wordt aan de hoofdquery doorgegeven. Vervolgens wordt met de hoofdquery gecontroleerd of de resultatenset werknemer-id's uit de tabel Orders bevat.

  9. Klik op het tabblad <ui>Ontwerp </ui> in de groep <ui>Resultaten</ui> op <ui>Uitvoeren</ui>.

    De query wordt uitgevoerd, waarna een lijst met orders wordt opgehaald die door andere werknemers dan vertegenwoordigers zijn verwerkt.

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

Algemene SQL-sleutelwoorden die u bij een subquery kunt gebruiken

Er zijn verschillende SQL-sleutelwoorden die u bij een subquery kunt gebruiken:

Opmerking: Dit is geen complete lijst. In een subquery kunt u elk geldig SQL-sleutelwoord gebruiken, met uitzondering van definitiesleutelwoorden.

  • <embeddedLabel>ALL</embeddedLabel> Gebruik ALL in een WHERE-component om de rijen op te halen die voldoen aan de voorwaarde wanneer ze worden vergeleken met elke rij van de subqueryresultaten.

    Stel dat u de gegevens van studenten op een universiteit analyseert. De studenten moeten een minimaal cijfergemiddelde handhaven dat per hoofdvak varieert. Hoofdvakken en de bijbehorende minimale cijfergemiddelden zijn opgeslagen in de tabel Hoofdvakken, en de relevante studentengegevens in de tabel Studentenrecords.

    Als u een lijst met hoofdvakken (en de bijbehorende minimale cijfergemiddelden) wilt weergeven waarvoor iedere student hoger dan het minimale cijfergemiddelde scoort, gebruikt u de volgende query:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • <embeddedLabel>ANY</embeddedLabel> Gebruik ANY in een WHERE-component om de rijen op te halen die voldoen aan de voorwaarde wanneer ze met minstens een van de rijen van de subqueryresultaten worden vergeleken.

    Stel dat u de gegevens van studenten op een universiteit analyseert. De studenten moeten een minimaal cijfergemiddelde handhaven dat per hoofdvak varieert. Hoofdvakken en de bijbehorende minimale cijfergemiddelden zijn opgeslagen in de tabel Hoofdvakken, en de relevante studentengegevens in de tabel Studentenrecords.

    Als u een lijst met hoofdvakken (en de bijbehorende minimale cijfergemiddelden) wilt weergegeven waarvoor een of meer studenten lager dan het minimale cijfergemiddelde scoren, gebruikt u de volgende query:

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

    Opmerking: U kunt het sleutelwoord SOME voor hetzelfde doeleinde gebruiken. Dit sleutelwoord is synoniem met ANY.

  • <embeddedLabel>EXISTS</embeddedLabel> Gebruik EXISTS in een WHERE-component om aan te geven dat een subquery minstens één rij als resultaat moet geven. EXISTS kan ook worden voorafgegaan door NOT om aan te geven dat een subquery geen rijen mag opleveren.

    Via volgende query wordt bijvoorbeeld een lijst met producten opgehaald die in minstens één bestaande order voorkomen:

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

    Bij gebruik van NOT EXISTS wordt via de query een lijst met producten opgehaald die niet in minstens één bestaande order voorkomen:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • <embeddedLabel>IN</embeddedLabel> Gebruik IN in een WHERE-component om na te gaan welke waarden in de huidige rij van de hoofdquery deel uitmaken van de resultatenset van de subquery. IN kan ook worden voorafgegaan door NOT om te controleren welke waarden in de huidige rij van de hoofdquery geen deel uitmaken van de resultatenset van de subquery.

    Via volgende query wordt bijvoorbeeld een lijst met de orders (en orderdatums) opgehaald die door andere werknemers dan verkopers zijn verwerkt:

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

    Bij gebruik van NOT IN kunt u dezelfde query als volgt schrijven:

    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">Naar boven</link>

Uw Office-vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Office Insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagents.

×