/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Tilfældige i SQL
Fra : Jens Vestergaard


Dato : 04-03-03 10:43

Hejsa.
SQL har aldrig været min stærke side...

Problem: Fra en database med 1000 poster skal jeg vælge 50 *tilfældige*, som
skal fremkomme i tilfældig rækkefølge, når man 'bladrer' igennem dem.
Løsning: ?

Jeg kender SELECT TOP 50, men det giver jo de samme 50 hver gang, og det må
ikke forekomme. Det, jeg leder efter, ville jo være noget i retning af
"SELECT RANDOM 50", men det findes vist ikke liiiige...

P.t. løser jeg det ved at lavet en laaaaang SQL-sætning a'la: SELECT * FROM
myTb WHERE RecNo = x OR RecNo = y OR ...., hvor x, y .... er tilfældigt
genererede tal mellem 0 og RecordCount, men det er jo molboagtigt.

En anden løsning kunne være at udvælge én record ad gangen og lægge alle
felterne over i et array

Men der MÅ da være en bedre måde... ?

--
mvh
Jens Vestergaard (mailadr i dette indlæg er ikke gyldig!)
www.railsoft.dk
Døgnets jernbanenyheder: www.railsoft.dk/medier.asp




 
 
Mikkel Bundgaard (04-03-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 04-03-03 15:59

On Tue, 04 Mar 2003 10:43:13 +0100, Jens Vestergaard wrote:

> Hejsa.
> SQL har aldrig været min stærke side...
>
> Problem: Fra en database med 1000 poster skal jeg vælge 50 *tilfældige*, som
> skal fremkomme i tilfældig rækkefølge, når man 'bladrer' igennem dem.
> Løsning: ?
Se her (kommenteret udgave af
http://www.mvps.org/access/queries/qry0011.htm )

Man erklærer følgende funktion i et modul:

'Code courtesy of
'Joe Foster
'************ Code Begin ***********
Function Randomizer () As Integer
Static AlreadyDone As Integer
If AlreadyDone = False Then Randomize : AlreadyDone = True
Randomizer = 0
End Function
'************ Code End *************

Det, som funktionen gør, er, at kalde Randomize, hvis den ikke er blevet
kaldt før. Randomize initialiserer tilfældigtalsgeneratoren, således at
Rnd ikke returnerer den samme værdi som tidligere. Ellers returnerer
funktionen 0 hver gang den kaldes.

For at udtrække f.eks. 100 tilfældige poster, kan man bruge følgende
forespørgsel

SELECT TOP 100 mytable.*
FROM mytable
WHERE Randomizer() = 0
ORDER BY Rnd(IsNull(mytable.question) * 0 + 1)

Da funktionen Randomizer() returnerer 0 hver gang, overholder alle poster
betingelsen Randomizer() = 0. Betingelsen bruges derfor kun til at
initialisere tilfældigtalsgeneratoren én gang.

Umiddelbart virker "ORDER BY" delen også lidt mystisk, da
IsNull(mytable.question) * 0 altid giver 0 ligegyldig om IsNull returnerer
sand eller falsk. Man burde derfor i stedet kunne skrive ORDER BY Rnd(1),
da det er dette kald, der altid forekommer. Men hvis man gør dette
returnerer forespørgselen alle poster i tabellen. Dette er på grund af, at
ORDER BY Rnd(1) ses som en konstant (som er ens for alle poster), og da
prædikatet TOP vælger ikke mellem ens værdier, returneres alle.

IsNull(mytable.question) * 0 + 1 tvinger at resultatet udregnes for alle
poster, derfor bliver Rnd kaldt for alle poster. Da Rnd returnerer en
tilfældig værdi (når argumentet er større end 0), får de enkelte poster en
lige chance for at blive returneret.
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Jens Vestergaard (04-03-2003)
Kommentar
Fra : Jens Vestergaard


Dato : 04-03-03 18:34

"Mikkel Bundgaard" <mikkelbu@teliamail.dk> skrev i en meddelelse
news:pan.2003.03.04.14.59.17.163831@teliamail.dk...
> Se her (kommenteret udgave af
> http://www.mvps.org/access/queries/qry0011.htm )
>
[snip kode og kommentar]

Jep - det fungerer...delvist - jeg kan ikke få en ny række hver gang, og
Randomizer() virker tilsyneladende ikke.

Hvis jeg skriver:
"SELECT TOP 50 RecNo From tbSpm Where _
Randomizer() = 0 ORDER BY _
Rnd(IsNull(RecNo) * 0 + 1);"
- får jeg at vide, at funktionen Randomizer ikke er defineret. (Det er den)

Hvis jeg skriver
"SELECT TOP 50 RecNo From tbSpm Where " _
& Randomizer() = 0 & " ORDER BY _
Rnd(IsNull(RecNo) * 0 + 1);"
- kan jeg se, at Randomizer() kaldes, men nu returnerer hele sætningen False
(!!??)

Hvis jeg skriver
"SELECT TOP 50 RecNo From tbSpm Where True _
ORDER BY Rnd(IsNull(RecNo) * 0 + 1);"
- så får jeg mine 50 tilfældige records i tilfældig rækkefølge, men de samme
hver gang. Logisk nok!

Så troede jeg, at jeg kunne indføje Randomize umiddelbart inden selve
udtrækket, men det ændrer ikke noget.

Hvad gør jeg galt?


--
mvh
Jens Vestergaard (mailadr i dette indlæg er ikke gyldig!)
www.railsoft.dk
Døgnets jernbanenyheder: www.railsoft.dk/medier.asp



Krabsen (04-03-2003)
Kommentar
Fra : Krabsen


Dato : 04-03-03 16:43

Jeg ville prøve noget i retning af

SELECT TOP 50 Tabel.ID, Tabel.Navn, left(now()*[id];3) AS SlumpTal FROM
Tabel ORDER BY SlumpTal

!!

Det kan godt være, der mangler en string(slumptal) for at kunne lave en
left.

Desværre driller min Access og påstår, at udtrykket left(xx,3) ikke findes,
men det er formentlig fordi det er østenvind i dag. Det virker som regel i
vindstille
...spøg til side, den burde kunne gå..

prøv..

mvh
Krabsen



"Jens Vestergaard" <j@railsoft.dk> skrev i en meddelelse
news:3e6474f6$0$159$edfadb0f@dtext01.news.tele.dk...
> Hejsa.
> SQL har aldrig været min stærke side...
>
> Problem: Fra en database med 1000 poster skal jeg vælge 50 *tilfældige*,
som
> skal fremkomme i tilfældig rækkefølge, når man 'bladrer' igennem dem.
> Løsning: ?
>
> Jeg kender SELECT TOP 50, men det giver jo de samme 50 hver gang, og det

> ikke forekomme. Det, jeg leder efter, ville jo være noget i retning af
> "SELECT RANDOM 50", men det findes vist ikke liiiige...
>
> P.t. løser jeg det ved at lavet en laaaaang SQL-sætning a'la: SELECT *
FROM
> myTb WHERE RecNo = x OR RecNo = y OR ...., hvor x, y .... er tilfældigt
> genererede tal mellem 0 og RecordCount, men det er jo molboagtigt.
>
> En anden løsning kunne være at udvælge én record ad gangen og lægge alle
> felterne over i et array
>
> Men der MÅ da være en bedre måde... ?



Krabsen (04-03-2003)
Kommentar
Fra : Krabsen


Dato : 04-03-03 17:01

Eller den meget hurtige:

SELECT tabel.ID, tabel.Navn AS Udtryk1
FROM tabel
ORDER BY Rnd(IsNull(tabel.ID) * 0 + 1)


mvh

Krabsen



"Jens Vestergaard" <j@railsoft.dk> skrev i en meddelelse
news:3e6474f6$0$159$edfadb0f@dtext01.news.tele.dk...
> Hejsa.
> SQL har aldrig været min stærke side...
>
> Problem: Fra en database med 1000 poster skal jeg vælge 50 *tilfældige*,
som
> skal fremkomme i tilfældig rækkefølge, når man 'bladrer' igennem dem.
> Løsning: ?
>
> Jeg kender SELECT TOP 50, men det giver jo de samme 50 hver gang, og det

> ikke forekomme. Det, jeg leder efter, ville jo være noget i retning af
> "SELECT RANDOM 50", men det findes vist ikke liiiige...
>
> P.t. løser jeg det ved at lavet en laaaaang SQL-sætning a'la: SELECT *
FROM
> myTb WHERE RecNo = x OR RecNo = y OR ...., hvor x, y .... er tilfældigt
> genererede tal mellem 0 og RecordCount, men det er jo molboagtigt.
>
> En anden løsning kunne være at udvælge én record ad gangen og lægge alle
> felterne over i et array
>
> Men der MÅ da være en bedre måde... ?
>
> --
> mvh
> Jens Vestergaard (mailadr i dette indlæg er ikke gyldig!)
> www.railsoft.dk
> Døgnets jernbanenyheder: www.railsoft.dk/medier.asp
>
>
>



Ukendt (04-03-2003)
Kommentar
Fra : Ukendt


Dato : 04-03-03 20:29

Har du prøvet at skrive RANDOMIZE eller hvad den funktion hedder.. Det
virkede for mig, da jeg skulle finde nogle telfældige tal, men de blev de
samme, så prøv at skrive randomize inden kald af funktionen, det hjalp i
hvertfald mig

Mvh. Martin
"Krabsen" <news@krabsen.dk> skrev i en meddelelse
news:b42ik4$9q2$1@sunsite.dk...
> Eller den meget hurtige:
>
> SELECT tabel.ID, tabel.Navn AS Udtryk1
> FROM tabel
> ORDER BY Rnd(IsNull(tabel.ID) * 0 + 1)
>
>
> mvh
>
> Krabsen
>
>
>
> "Jens Vestergaard" <j@railsoft.dk> skrev i en meddelelse
> news:3e6474f6$0$159$edfadb0f@dtext01.news.tele.dk...
> > Hejsa.
> > SQL har aldrig været min stærke side...
> >
> > Problem: Fra en database med 1000 poster skal jeg vælge 50 *tilfældige*,
> som
> > skal fremkomme i tilfældig rækkefølge, når man 'bladrer' igennem dem.
> > Løsning: ?
> >
> > Jeg kender SELECT TOP 50, men det giver jo de samme 50 hver gang, og det
> må
> > ikke forekomme. Det, jeg leder efter, ville jo være noget i retning af
> > "SELECT RANDOM 50", men det findes vist ikke liiiige...
> >
> > P.t. løser jeg det ved at lavet en laaaaang SQL-sætning a'la: SELECT *
> FROM
> > myTb WHERE RecNo = x OR RecNo = y OR ...., hvor x, y .... er tilfældigt
> > genererede tal mellem 0 og RecordCount, men det er jo molboagtigt.
> >
> > En anden løsning kunne være at udvælge én record ad gangen og lægge alle
> > felterne over i et array
> >
> > Men der MÅ da være en bedre måde... ?
> >
> > --
> > mvh
> > Jens Vestergaard (mailadr i dette indlæg er ikke gyldig!)
> > www.railsoft.dk
> > Døgnets jernbanenyheder: www.railsoft.dk/medier.asp
> >
> >
> >
>
>



Søg
Reklame
Statistik
Spørgsmål : 177557
Tips : 31968
Nyheder : 719565
Indlæg : 6408879
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste