Een subquery is een query die je binnen een andere query gebruikt. Dat kan zijn als apart veld, of als criterium. Voorbeeldje van het laatste: je wilt in een query alle klanten zijn die nog nooit een bestelling hebben geplaatst. Daarvoor maak je een query op basis van je klanten, en ga je kijken in de tabel Bestellingen welke klanten ooit iets besteld hebben. Dat laatste doe je met de query (SELECT DISTINCT KLantID FROM Bestellingen) die een lijst oplevert met KlantID's van alle klanten die besteld hebben. Deze gasten wil je nu juist
niet zien, dus in de resultaatquery maak je een criterium, waarin je deze klanten wegfiltert. Je krijgt dan als criterium:
Code:
Not In (SELECT DISTINCT KLantID FROM Bestellingen)
En dat is dus een voorbeeld van een subquery.
Deze variant levert meestal meerdere waarden op, en als criterium is dat prima. In jouw geval heb je één resultaat nodig, en dan niet als criterium maar als gegeven in de query. De subquery moet dus een eigen veld worden. Een voorbeeldje daarvan is het volgende veld:
Code:
Vorige Waterstand: (SELECT TOP 1 Water FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum ORDER BY T1.Datum DESC )
Hier wordt een veld [Vorige Waterstand] gemaakt dat wordt gezet naast de huidige watermeting. Dat gebeurt door een query te maken waarin dezelfde tabel wordt gebruikt met een Alias naam (T1). De query filtert de resultaten op meetdatums die kleiner zijn dan de datum in het record (T1.Datum < Meterstanden.Datum), en is dan ook aflopend gesorteerd op datum. Dat levert voor het eerste record niks op (kleinste is nu eenmaal de kleinste), het tweede record laat 1 record zien, het derde record 3, het 10e record 9 en zo verder. Als je een resultaat terug wilt zien in een query, mag er maar één waarde te zien zijn; je kunt geen query als veld gebruiken die meer dan één mogelijke waarde oplevert. Daarom laat de query in het resultaat maar één waarde zien (TOP 1). En dat levert bij elkaar bovenstaande query op. Het resultaat ziet er dan zo uit:
Code:
Datum VorigWater Water Verbruik
15-5-2007 125 0
15-6-2007 125 131 6
15-7-2007 131 139 8
15-8-2007 139 143 4
15-9-2007 143 148 5
15-10-2007 148 152 4
15-11-2007 152 157 5
Noodzakelijk is dus dat je de gegevens op de juiste manier sorteert, want anders werkt deze werkwijze niet.