Een query in een andere query of in een expressie nesten door middel van een subquery

Belangrijk: Dit artikel is automatisch vertaald, bekijk de disclaimer. De Engelse versie van dit artikel vindt u hier voor referentiedoeleinden.

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 zien. Als u een query wilt maken die dit interval als resultaat geeft, 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 subquery te gebruiken.

U kunt een subquery in een expressie of in een SQL-instructie (Structured Query Language) in de SQL-weergave schrijven.

In dit artikel

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

Een subquery als criterium voor een queryveld gebruiken

Algemene SQL-sleutelwoorden die u bij een subquery kunt gebruiken

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

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

Opmerking: Een subquery die u als veldalias gebruikt, kan slechts één veld als resultaat geven.

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 bovenvermelde voorbeeld, dat u het interval tussen orders voor elk van uw producten wilt zien. 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 die deze informatie als resultaat geeft.

Weergeven hoe u Noordenwind 2007 kunt instellen

  1. Klik op de Microsoft Office-knop afbeelding office-knop en klik op Nieuw.

  2. Klik in het linkerdeelvenster onder Sjablooncategorieën op Lokale sjablonen.

  3. Klik onder Lokale sjablonen op Noordenwind 2007 en klik vervolgens op Maken.

  4. Volg de aanwijzingen op de pagina Noordenwind BV (op het objecttabblad van het opstartscherm) om de database te openen en sluit vervolgens het Aanmeldingsvenster.

  1. Ga naar het het tabblad Maken en klik in de groep Overige op Queryontwerp.

  2. Klik in het dialoogvenster Tabel weergeven op de tab Query's en dubbelklik vervolgens op Productorders.

  3. Sluit het dialoogvenster Tabel weergeven.

  4. Dubbelklik op het veld Productnummer en het veld Orderdatum om deze velden toe te voegen aan het queryontwerpraster.

  5. Selecteer Oplopend in de rij Sorteren van de kolom Productnummer van het raster.

  6. Selecteer Aflopend in de rij Sorteren van de kolom Orderdatum van het raster.

  7. Klik in de derde kolom van het raster met de rechtermuisknop op de rij Veld en klik vervolgens in het snelmenu op In- en uitzoomen.

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

    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.

  9. Typ de volgende expressie in de rij Veld in de vierde kolom van het raster:

Interval: [Order Date]-[Prior Date]

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.

  1. Ga naar het tabblad Ontwerp en klik in de groep Resultaten op Uitvoeren.

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

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

  2. Sluit de database Noordenwind.

Naar boven

Een subquery als criterium voor een queryveld gebruiken

U kunt een subquery als veldcriterium 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 geen vertegenwoordiger zijn. Als u een lijst met deze werknemers wilt genereren, moet u de werknemer-id voor elke order vergelijken met een lijst van de werknemer-id's voor werknemers die geen vertegenwoordiger zijn. U kunt deze lijst maken en als veldcriterium gebruiken met behulp van een subquery. Hiervoor voert u de volgende stappen uit:

  1. Open Noordenwind 2007.ACCDB en schakel de inhoud ervan in.

  2. Sluit het aanmeldingsvenster.

  3. Ga naar het het tabblad Maken en klik in de groep Overige op Queryontwerp.

  4. Open het tabblad Tabellen van het dialoogvenster Tabel weergeven en dubbelklik op Orders en Werknemers.

  5. Sluit het dialoogvenster Tabel weergeven.

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

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

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

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

    Dit is de subquery. De subquery geeft als resultaat alle werknemer-id's van werknemers die niet de functie Vertegenwoordiger hebben. Deze resultaatset wordt aan de hoofdquery doorgegeven. Vervolgens wordt door de hoofdquery gecontroleerd of de resultaatset werknemer-id's uit de tabel Orders bevat.

  9. Ga naar het tabblad Ontwerp en klik in de groep Resultaten op Uitvoeren.

    De query wordt uitgevoerd en geeft als resultaat een lijst van de orders die door andere werknemers dan vertegenwoordigers zijn verwerkt.

Naar boven

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.

  • ALL    Gebruik ALL in een WHERE-component om de rijen op te halen die, bij vergelijking met elke rij van de subqueryresultaten, voldoen aan de voorwaarde.

    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 zien 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]);
  • ANY    Gebruik ANY in een WHERE-component om de rijen op te halen die, bij vergelijking met minstens één van de rijen van de subqueryresultaten, voldoen aan de voorwaarde.

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

  • EXISTS    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.

    De volgende query levert bijvoorbeeld een lijst met producten op 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 levert de query een lijst met producten op 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]);
  • IN    Gebruik IN in een WHERE-component om na te gaan welke waarden in de huidige rij van de hoofdquery deel uitmaken van de resultaatset 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 resultaatset van de subquery.

    De volgende query geeft bijvoorbeeld als resultaat een lijst van de orders (met orderdatums) die door andere werknemers dan vertegenwoordigers 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');

Naar boven

Opmerking: Disclaimer voor automatische vertaling: Dit artikel is vertaald door een computersysteem zonder menselijke tussenkomst. Microsoft biedt deze automatische vertalingen aan om niet-Engels sprekende gebruikers te helpen de inhoud over producten, services en technologieën van Microsoft te raadplegen. Omdat het artikel automatisch is vertaald, bevat het mogelijk fouten in grammatica, woordenschat en syntaxis.

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.

×