Toon posts:

[access] Random getal in rij mbv updatequery?*

Pagina: 1
Acties:
  • 496 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik probeer met een updateselectie een random getal in een kolom te zetten.
Maar het random getal wordt 1 maal berekend en in iedere rij wordt hetzelfde getal toegevoeg.

UPDATE leden SET leden.randomgetal = Rnd(1);

De bedoeling is dat ik in iedere rij een ander willekeurig getal krijg.

Ik wil dit getal namelijk gebruiken om een willekeurige sorteervolgorde te krijgen bij een overzicht.

Wie kan mij helpen.

:'(

Verwijderd

Welke database ?

Dat je iedere keer dezelfde waard ekrijgt is in principe logisch, de expressie wordt eenmalig geevalueerd en de daaruit resulterende waarde wordt gebruikt. Als je dit zou willen doen, moet je het waarschijnlijk per regel doen.

[ Voor 88% gewijzigd door Verwijderd op 07-04-2006 11:44 ]


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 21-12-2025
Je moet dan zoeken op GoT naar "meerdere rijen updaten" of iets in die trant..

http://gathering.tweakers...update%2Cmeerdere%2Crijen

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 07 april 2006 @ 11:39:
Welke database ?

Dat je iedere keer dezelfde waard ekrijgt is in principe logisch, de expressie wordt eenmalig geevalueerd en de daaruit resulterende waarde wordt gebruikt. Als je dit zou willen doen, moet je het waarschijnlijk per regel doen.
Sorry selectie gebeurd in Access

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Idd een gevalletje optimalisatie: rnd(1) wordt één keer berekend en vervolgens toegepast. Als het een access database betreft is de meest eenvoudige oplossing om aan rnd() een numeriek veld mee te geven waardoor de randomgenerator voor iedere rij opnieuw wordt geinitialiseerd.
code:
1
UPDATE leden SET leden.randomgetal = Rnd([id]);


offtopic:
titel fixed

[ Voor 34% gewijzigd door Lustucru op 07-04-2006 11:59 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Niesje schreef op vrijdag 07 april 2006 @ 11:58:
Idd een gevalletje optimalisatie: rnd(1) wordt één keer berekend en vervolgens toegepast. Als het een access database betreft is de meest eenvoudige oplossing om aan rnd() een numeriek veld mee te geven waardoor de randomgenerator voor iedere rij opnieuw wordt geinitialiseerd.
code:
1
UPDATE leden SET leden.randomgetal = Rnd([id]);


offtopic:
titel fixed
:) Wat is het toch simpel, vriendelijk bedankt.

  • digit7722
  • Registratie: Juni 2001
  • Laatst online: 27-11-2018

digit7722

Rule # 217

Hmm ik heb hetzelfde probleem maar ik snap het toch niet helemaal.

Ik heb een selectie query die er als volgt uitziet:

Ik bij het tweede veld "getal: Int((100-1+1)*Rnd()+1)" ingevuld als veld naam
het werkt maar elk record heeft hetzelfde getal.
Hoe kan ik het nu voor elk veld random maken?

[ Voor 58% gewijzigd door digit7722 op 23-06-2006 11:54 ]

You can't free a fish from water.


Verwijderd

Je kan het beter nog anders doen. Nu heb je wel een willekeurige sorteervolgorde, maar deze is wel telkens op dezelfde wijze willekeurig (je maakt immers slechts eenmaal een random veld aan). Beter kan je de random variabele meenemen in de SELECT query van je overzicht.

SQL:
1
2
3
4
SELECT ...., rnd(ID)
FROM ...
WHERE ...
ORDER BY rnd(ID);


^^Voor hierboven, je moet je rnd "seeden" met een getal. Hier kan je het beste je PK voor pakken (is immers uniek).

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Digit7727, lees de antwoorden boven je eerst eens ;)

offtopic:
@dido:
de eerste heeft meer vetgedrukte letters? Heb ik nu een koelkast?

[ Voor 61% gewijzigd door Lustucru op 23-06-2006 12:03 . Reden: dido's raadseltje opgelost ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 28-07 11:06

Dido

heforshe

Je ziet het verschil tussen Rnd(iets variabels a la [id]) en iets constants*Rnd() niet?

Wat betekent mijn avatar?


  • digit7722
  • Registratie: Juni 2001
  • Laatst online: 27-11-2018

digit7722

Rule # 217

hmm als ik een variable als rnd[id] gebruik hou ik op elk veld hetzelfde getal.
ik snap het verschil tussen een variable en een constante wel maar ik krijg hem niet zover dat rnd voor elk veld opnieuw een berekening maakt.
hij maakt 1 keer een random getal en vult dat op elk veld in.

is er geen mogelijkheid om rnd voor elke rij opnieuw te laten rekenen ?

You can't free a fish from water.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Leg eens uit wat je niet snapt aan:
[rml]Niesje in "[ access] Random getal in rij mbv updateq..."[/rml]
en
[rml]DaJaN in "[ access] Random getal in rij mbv updateq..."[/rml]

daarnaast ben je nogal onduidelijk: heb je nu meerdere velden of meerdere records? Heb je een update of een insert query? Is [id] een veld in je tabel? Post de hele sql eens...
en btw: 100+1-1 is lichtjes zinloos ;)

[ Voor 17% gewijzigd door Lustucru op 23-06-2006 12:59 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • digit7722
  • Registratie: Juni 2001
  • Laatst online: 27-11-2018

digit7722

Rule # 217

ok hier mijn sql regel.
code:
1
UPDATE [Main Table] SET [Main Table].[Number] = Int((100)*Rnd([id])+1);

id is een variable die door de gebruiker ingevoerd dient te worden?
dat is wat ik dacht te moeten doen aan de hand van de info hierboven.

maar nog steeds elke regel heeft hetzelfde nummer.

You can't free a fish from water.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dat heb je verkeerd begrepen. Numeriek veld of PK staat niet voor gebruikersinvoer. We blijven het niet herhalen.

edit:
en weer open op verzoek van mensen die nog iets toe willen voegen. Vragen waarop het antwoord letterlijk te lezen is in voorgaande posts zorgen ervoor dat het topic direct weer op slot gaat ;)

[ Voor 48% gewijzigd door Lustucru op 23-06-2006 16:13 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Ik had nog even gevraagd of het topic open mocht. Je hebt twee wegen die je kan bewandelen, maar let op, je zal je rnd() altijd moeten seeden met een (wisselend) getal! Vandaar dat je userinput ook niet werkt.

1. Je gaat random getallen maken aan de hand van je Primairy Key (PK). Dit is de unieke id van een record in een tabel. In Access kan dit het "autonummeringsveld" zijn. Je doet dan rnd(naam van het PK veld).

2. Je gaat random getallen maken aan de hand van een timestamp. Deze verandert immers ook continue. Dit doe je door rnd(now()) op te geven.

Hopelijk wordt het je nu duidelijk! ;)

[ Voor 6% gewijzigd door Verwijderd op 23-06-2006 21:55 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Nofi, maar dit is niet (helemaal) waar. Het probleem schuilt namelijk niet in rnd, maar in de optimalisatie van de query die Access toepast voor executie. Access zal voor het uitvoeren van een query zoveel mogelijk berekeningen in een query vervangen door vaste waarden, om niet voor ieder record dezelfde berekening te hoeven herhalen. Rnd(now) zal dus niet werken: het wordt één keer berekend en vervolgens voor alle records toegepast.

Rnd([veld]) werkt wel, omdat het onmogelijk is om vóór het uitvoeren van de query rnd([veld]) te berekenen. Access moet dan dus voor elk record rnd([veld]) opnieuw bepalen. De waarde in [veld] hoeft niet uniek te zijn, want rnd() is zo geprogrammeerd dat rnd([constante]) bij iedere nieuwe aanroep een andere waarde retourneert.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Niesje schreef op zaterdag 24 juni 2006 @ 11:50:
Nofi, maar dit is niet (helemaal) waar. Het probleem schuilt namelijk niet in rnd, maar in de optimalisatie van de query die Access toepast voor executie. Access zal voor het uitvoeren van een query zoveel mogelijk berekeningen in een query vervangen door vaste waarden, om niet voor ieder record dezelfde berekening te hoeven herhalen. Rnd(now) zal dus niet werken: het wordt één keer berekend en vervolgens voor alle records toegepast.

Rnd([veld]) werkt wel, omdat het onmogelijk is om vóór het uitvoeren van de query rnd([veld]) te berekenen. Access moet dan dus voor elk record rnd([veld]) opnieuw bepalen. De waarde in [veld] hoeft niet uniek te zijn, want rnd() is zo geprogrammeerd dat rnd([constante]) bij iedere nieuwe aanroep een andere waarde retourneert.
Verrek, je hebt gelijk! Had het idee dat ik dit vroeger ooit zo opgelost had... Niet dus. ;)
Pagina: 1