unieke waarde unieke records in eigenschap query

Status
Niet open voor verdere reacties.

Janzan

Gebruiker
Lid geworden
10 jan 2012
Berichten
61
Beste mensen,

Is er iemand die mij nu eens helder uit kan leggen wat het verschil is tussen de eigenschappen (van een query) unieke waardes en unieke records
Ik dacht dat de eigenschap unieke records zou voorkomen dat er dubbele records in beeld komen.
Maar dat is niet het geval.....wel als ik de eigenschap unieke waarde gebruikt.
Die laatste eigenschap kijkt volgens mij of de waarde in alle velden van een rij ook exact zo voorkomen in een andere rij.
Dus als de records dan helemaal gelijk zijn wordt er maar 1 weergegeven.
Maar wat doet de eigenschap unieke records dan??
De tabel onder de query maak geen gebruik van sleutelvelden, het is gewoon een tabel met een stuk of 20 velden.
Iik wil alleen die records zien waarvan alle velden uniek zijn.

b.v.b. dank
 
Interessante vraag, want je hebt natuurlijk gelijk: het is behoorlijk mistig wat daarmee bedoeld wordt. Het wordt misschien wat duidelijker als je kijkt naar de SQL vertaling van de twee opties:
Unieke waarden:
Code:
SELECT DISTINCT [Veldnamen] FROM [Tabel1] INNER JOIN [Tabel2] ON [Tabel1].SleutelID = [Tabel2].SleutelID
Unieke Records:
Code:
SELECT DISTINCTROW [Veldnamen] FROM [Tabel1] INNER JOIN [Tabel2] ON [Tabel1].SleutelID = [Tabel2].SleutelID
Je geeft zelf al in je laatste zin aan wat DISTINCT doet: controleren of alle velden die je ziet uniek zijn. Een query met DISTINCT geeft als resultaat altijd een snapshot; het resultaat van de query kan ook niet bewerkt worden.
Maar er is nog een andere vorm van uniekheid, en die is op basis van het volledige record: DISTINCTROW. Deze variant kijkt niet naar de velden die in het resultaat van de query uniek zijn, maar naar de volledige records die aan de basis staan van de query. Dus ook al gebruik je maar één veld van een tabel, DISTINCTROW kijkt naar unieke records op basis van alle velden uit de brontabellen. En dat levert dus meestal een uitgebreidere recordset op. Bijkomend voordeel: een query op basis van DISTINCTROW blijft bewerkbaar, omdat de unieke records uit een onderliggende tabel altijd getoond worden. En individuele records kun je uiteraard bewerken.
Een voorbeeldje maakt het hopelijk wat duidelijker :)

Neem een tabel Klanten:
Klant-id Bedrijfsnaam Plaats Land
1 Ernst Handel Berlijn Duitsland
2 Familia Arquibaldo Madrid Spanje
3 FISSA Fabrica Inter. Salchichas S.A. Rome Italië
4 Folies gourmandes Nancy Parijs
5 Ernst Handel Parijs Frankrijk
En een tabel Bestellingen:
Klant-id Bestelling-id Besteldatum
1 10698 10-5-2012
1 10512 11-5-2012
3 10725 10-5-2012
4 10763 13-5-2012
4 10408 12-5-2012
Maak nu een standaard query:
Code:
SELECT Bedrijfsnaam FROM Bestellingen INNER JOIN Klanten ON Bestellingen.[Klant-id] = Klanten.[Klant-id];
Deze levert als resultaat:
Bedrijfsnaam
Ernst Handel
Ernst Handel
FISSA Fabrica Inter. Salchichas S.A.
Folies gourmandes
Folies gourmandes
Je ziet dat voor elk record uit [Bestellingen] een klantrecord wordt gemaakt. De query is te bewerken.
Met DISTINCT halen we de unieke waarden uit de recordset. Die bestaat uit één veld, dus er wordt naar één veld gekeken.
Code:
SELECT DISTINCT Bedrijfsnaam FROM Bestellingen INNER JOIN Klanten ON Bestellingen.[Klant-id] = Klanten.[Klant-id];
Resultaat:
Bedrijfsnaam
Ernst Handel
FISSA Fabrica Inter. Salchichas S.A.
Folies gourmandes
Kijken we nu naar de unieke records; dat zijn dus complete unieke records uit Klanten en Bestellingen.
Bedrijfsnaam
Ernst Handel
FISSA Fabrica Inter. Salchichas S.A.
Folies gourmandes
Ernst Handel
Je ziet Ernst Handel er nu twee keer in staan; dat komt omdat er in KLANTEN twee records zijn voor dit bedrijf; één voor het filiaal in Berlijn, en één voor Parijs. Zoals gezegd: de resultaten zijn nu wèl te bewerken, in tegenstelling tot een DISTINCT query.
Samenvattend: DISTINCT kijkt naar de unieke resultaten in de query op basis van de geselecteerde velden, DISTINCTROW kijkt naar de unieke resultaten in de query op basis van de geselecteerde tabellen.
Hopelijk is het nu wat duidelijker...
 
Duidelijk.......maar dan heb ik een vervolg vraag.
Ik heb een query met als basis een tabel met behoorlijk wat velden.
In het query ontwerpvenster selecteer ik als veld het sterretje, dat zijn dus alle velden van de tabel toch?
Vervolgens bij eigenschappen unieke waardes resultaat 15036 records
Kiest ik voor unieke records 17163 records.

kies ik voor geen van beide ook 17163 records.
Er is dus geen verschil tussen de keuze wel of geen unieke records.
Volgens mij zou er dan geen verschil moeten zijn toch?, en in beide opties 15036 records moeten verschijnen.
Welke denkfout maak ik nu??


Als ik dus kies voor unieke records blijven de dubbelen er in...
Code:
SELECT DISTINCTROW EPT.volgnummer, EPT.[datum afschrift], EPT.aanvoerbriefnummer, EPT.aanvoerbriefvolgletter, EPT.partijnummer, EPT.artikelcode, EPT.artikelnaam, EPT.kwekernummer, EPT.veilingnummer, EPT.veilingnaam, EPT.fustcode, EPT.fustnaam, EPT.[stuks per eenheid], EPT.S1, EPT.[S1-waarde], EPT.S2, EPT.[S2-waarde], EPT.S3, EPT.[S3-waarde], EPT.S4, EPT.[S4-waarde], EPT.kwaliteitscode, EPT.instrumentcode, EPT.kloknummer, EPT.kloknaam, EPT.[soort bericht], EPT.transactie, EPT.[datum transactie/correctie], EPT.kopernummer, EPT.kopernaam, EPT.veiltijdstip, EPT.[aantal eenheden], EPT.[totaal aantal], EPT.[geboden prijs], EPT.opbrengst, EPT.transactienummer, EPT.controle, EPT.Weekdag, EPT.Week, EPT.Maand, EPT.Jaar, EPT.[Week Jaar], EPT.[Maand Jaar], EPT.euro
FROM EPT;

Code:
SELECT DISTINCT EPT.volgnummer, EPT.[datum afschrift], EPT.aanvoerbriefnummer, EPT.aanvoerbriefvolgletter, EPT.partijnummer, EPT.artikelcode, EPT.artikelnaam, EPT.kwekernummer, EPT.veilingnummer, EPT.veilingnaam, EPT.fustcode, EPT.fustnaam, EPT.[stuks per eenheid], EPT.S1, EPT.[S1-waarde], EPT.S2, EPT.[S2-waarde], EPT.S3, EPT.[S3-waarde], EPT.S4, EPT.[S4-waarde], EPT.kwaliteitscode, EPT.instrumentcode, EPT.kloknummer, EPT.kloknaam, EPT.[soort bericht], EPT.transactie, EPT.[datum transactie/correctie], EPT.kopernummer, EPT.kopernaam, EPT.veiltijdstip, EPT.[aantal eenheden], EPT.[totaal aantal], EPT.[geboden prijs], EPT.opbrengst, EPT.transactienummer, EPT.controle, EPT.Weekdag, EPT.Week, EPT.Maand, EPT.Jaar, EPT.[Week Jaar], EPT.[Maand Jaar], EPT.euro
FROM EPT;
 
Ik had er nog bij moeten zeggen (maar heb dat gezien de lengte van het verhaal niet gedaan) dat DISTINCTROW niet werkt op één tabel; de instelling wordt dan genegeerd. Je kunt DISTINCTROW dus alleen gebruiken in een query met meer dan één tabel. Vandaar dat het resultaat hetzelfde is als de variant zonder DISTINCTROW.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan