Als je de query goed wilt begrijpen, zou je het criterium eens moeten verwijderen (knippen, want je wilt 'm ook weer terug zetten...), en de query uitvoeren. Je zult dan zien, dat je ineens veel meer records te zien krijgt: 32 namelijk i.p.v. de 8 die er met criterium in zitten. De reden daarvoor is eigenlijk heel simpel: omdat de twee tabellen (BronTabel en BereikTabel) niet aan elkaar gekoppeld zijn, kan Access het resultaat niet baseren op overeenkomende waarden in de twee tabellen. Normaal gesproken heb je in TabelA (Klanten) bijvoorbeeld een sleutelveld KlantID, en in TabelB (Orders) een referentieveld KlantID. Door de twee KlantID's aan elkaar te koppelen, krijg je in het resultaat alle orders per klant te zien. Ontbreekt deze koppeling, dan weet Access niet welk records uit Orders horen bij welke KlantID's uit Klanten. Het resultaat: alle records uit de ene tabel worden gekoppeld aan alle records uit de andere tabel.
En dat is precies wat er gebeurt in de query qPrijzen, als je het criterium weghaalt. In de BronTabel zie je 8 records met artikelen en prijzen, en in de BereikTabel vind je 4 records met categorieën. Omdat er geen directe koppeling is tussen de velden, zal Access alle records uit de BronTabel koppelen aan alle records uit de BereikTabel. Oftewel: 8 records uit de BronTabel * 4 records uit de BereikTabel = 32 records. En dat is dus een Cartesisch product. Op zich is het een redelijk zinloze manier van gegevens koppelen, maar het laat dus alle mogelijke combinaties zien die er mogelijk zijn.
In het voorbeeld (en dat geldt dus ook voor jouw situatie) heb je geen velden die exact overeenkomen met elkaar. In de BronTabel heb je een veld Waarden. Dit veld bevat allerlei verschillende bedragen. In de BereikTabel heb je twee velden: [Vanaf] en [TotEnMet]. Je kunt dus geen koppeling maken tussen het veld [Waarde] en het veld [Vanaf], of het veld [Waarde] en het veld [TotEnMet]. Wèl kun je kijken of het getal in het veld [Waarde]
tussen de waarden uit [Vanaf] en [TotEnMet] ligt. En dat doe je met het criterium. Daarmee filter je a.h.w. drie records uit het cartesisch product weg uit het resultaat: namelijk die records waarvan de waarde t.o.v. de velden [Vanaf] en [TotEnMet] niet voldoen aan het criterium. Ik zal dat nog even verduidelijken met een voorbeeldje.
ID Produkt Waarde Klasse Vanaf TotEnMet
7 Hagelslag € 44,00 Prijsgroep A € 0,00 € 20,00
7 Hagelslag € 44,00 Prijsgroep B € 20,00 € 40,00
7 Hagelslag € 44,00 Prijsgroep C € 40,00 € 60,00
7 Hagelslag € 44,00 Prijsgroep D € 60,00 € 9.999,00
In de tabel zie je de 4 records die worden gemaakt als er geen criterium is toegepast. Je ziet het artikel 4 keer verschijnen, omdat er 4 records zijn in de BereikTabel (zie hierboven). Elk artikel is gecombineerd met een Prijsgroep. Je ziet dat de correcte categorie Prijsgroep C is: de prijs van € 44,00 valt in de range € 40,00 - € 60,00. En dat is Prijsgroep C. Prijsgroepen A en B zijn te laag, en Prijsgroep D is te hoog. Het criterium [Waarde]>[Vanaf] And [Waarde]<=[TotEnMet] pakt dus precies de juiste categorie: 44 is groter dan 40, en 44 is kleiner dan 60.
En zo werkt dus een criterium op een cartesisch product...