Avatar billede bodekaer Nybegynder
21. oktober 2002 - 13:28 Der er 15 kommentarer og
2 løsninger

Lave en query med "tilfældige data"

Hej alle,

Jeg har et spørgsmål som jeg ikke helt ved hvordan jeg skal formulere, but here goes:

Jeg har lavet en query der f.eks. udregner følgende:

[theNumber] * 2

Den udskriver altså alle [theNumber], bare fordoblet.


Nu har jeg så en query som skal udregne disse ting for talene 1 - 5000.
Altså opretter jeg en tabel med feltet [theNumber] og indsætter 5000 værdier...

En query kunne se sådan ud:
SELECT [theNumber]*2 AS result
FROM [tbl-numbers];


Det jeg nu gerne vil undgå er at lave en tabel med 5000 værdier i, men istedet forestillede jeg mig at man lavede en "For i = 1 to 5000" eller noget.
Kan dette lade sig gøre?

(SQL koden jeg har er langt mere advanceret end ovenstående, men jeg har bare lavet dette eksempel for at vise hvad jeg vil)
Jeg har også en årsag til at jeg ikke kan oprette en tabel med 5000 værdier.



Håber på et godt svar,

Michael
Avatar billede terry Ekspert
21. oktober 2002 - 13:34 #1
dont thnk you can without another table. Why cant you have another table?
21. oktober 2002 - 13:34 #2
Du kan ikke lave en query, som giver dig tallene fra 1 til 5000!
Du er nødt til at have tallene liggende i en tabel.

Denne tabel kan så autogenereres hver gang du skal bruge den, eller du kan have den liggende.

Hvis du ønsker at se koden til at generere tabellen, så sig til.

/Thomas
Avatar billede bodekaer Nybegynder
21. oktober 2002 - 13:37 #3
Fordi jeg skal lave en relation imellem to tabeller. Og da relationen imellem de to tabeller skal kædes til nogle felter, skal jeg til at oprette et til felt i de to tabeller så de kan kædes sammen.

F.eks.:

[tbl-numbers]
id
no

[tbl-prices]
id
price


Nu kan jeg så kæde de to tabeller sammen via feltet ID, men så skal jeg jo i [tbl-numbers] oprette 5000 poster for hver eneste [id]

You see?
Avatar billede bodekaer Nybegynder
21. oktober 2002 - 13:38 #4
Hvis du har en SQL kode som kan generere tabellen, vil jeg gerne se det. Kan godt lave det i VB.
21. oktober 2002 - 13:39 #5
Public Function GenerateTabel()
    Dim rs As New ADODB.Recordset
    Dim n As Long
    rs.Open "DinTabel", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    For n = 1 To 5000
        rs.AddNew
        rs!TheNumber = n
        rs.Update
    Next n
    rs.Close
    Set rs = Nothing
End Function
Avatar billede proaccess Nybegynder
21. oktober 2002 - 13:40 #6
Du behøver "kun" at oprette 1 til 5000 een gang...

Du kan så "koble dem sammen med" id'erne ved en Cross Join:

SELECT [tbl-numbers].no, [tbl-prices].id
FROM [tbl-numbers], [tbl-prices];
21. oktober 2002 - 13:40 #7
Du kan faktisk bare have en tabel udelukkende med de 5000 numre, og så stadig bruge tabellen i en forespørgsel. Du skal blot undlade at joine tabellen med [tbl-prices].
21. oktober 2002 - 13:41 #8
Proaccess-> præcis :o)
21. oktober 2002 - 13:45 #9
bodekaer-> min kode kræver en reference til ADO. Dvs, hvis du bruger Access 97 skal du gå i VBA->tools->References og finde "Microsoft ActiveX 2.x Object Library", hvis den er der. Hvis ikke, må du lige sige til.
Avatar billede bodekaer Nybegynder
21. oktober 2002 - 13:46 #10
Det har jeg faktisk også prøvet, men jeg bruger GROUP BY, og har det ikke indflydelse?

Nu kommer hele smøren lige :) :

SELECT [tbl-price_list].[price-autoid], #12/30/1899 10:0:0# AS sd, IIf(([ed]-[price-roundafter]) Mod [price-rounding]=0,1,0)*Max(Replace(IIf((DateAdd('n',[ed],[sd]) Between [period-starttime] And [period-endtime]) And (8 And 2^3),[period-hourly],-1),-1,[price-hourly]))/60 AS MinutePrice, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-startup]),[price-startup]) AS Startup, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-minimum]),[price-minimum]) AS Minimum, Max(IIf([ed]>[rate-afterminutes] And ([ed]<=[rate-tominutes] Or [rate-tominutes]=-1),[rate-discount],0))/100 AS Discount
FROM [tbl-numbers], [tbl-price_discounts] RIGHT JOIN ([tbl-price_periods] RIGHT JOIN [tbl-price_list] ON [tbl-price_periods].[period-priceid] = [tbl-price_list].[price-autoid]) ON [tbl-price_discounts].[rate-priceid] = [tbl-price_list].[price-autoid]
GROUP BY [tbl-price_list].[price-autoid], [tbl-price_list].[price-hourly], [tbl-price_list].[price-minimum], [tbl-price_list].[price-startup], [tbl-price_list].[price-rounding], [tbl-price_list].[price-roundafter]
HAVING ((([tbl-price_list].[price-autoid])=2));



Kan man gøre noget smart?
21. oktober 2002 - 13:50 #11
Slag på tærsklen:

SELECT [tbl-price_list].[price-autoid], #12/30/1899 10:0:0# AS sd, IIf(([ed]-[price-roundafter]) Mod [price-rounding]=0,1,0)*Max(Replace(IIf((DateAdd('n',[ed],[sd]) Between [period-starttime] And [period-endtime]) And (8 And 2^3),[period-hourly],-1),-1,[price-hourly]))/60 AS MinutePrice, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-startup]),[price-startup]) AS Startup, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-minimum]),[price-minimum]) AS Minimum, Max(IIf([ed]>[rate-afterminutes] And ([ed]<=[rate-tominutes] Or [rate-tominutes]=-1),[rate-discount],0))/100 AS Discount
FROM [tbl-numbers], [tbl-price_discounts] RIGHT JOIN ([tbl-price_periods] RIGHT JOIN [tbl-price_list] ON [tbl-price_periods].[period-priceid] = [tbl-price_list].[price-autoid]) ON [tbl-price_discounts].[rate-priceid] = [tbl-price_list].[price-autoid]
GROUP BY [tbl-price_list].[price-autoid], [tbl-price_list].[price-hourly], [tbl-price_list].[price-minimum], [tbl-price_list].[price-startup], [tbl-price_list].[price-rounding], [tbl-price_list].[price-roundafter], [tbl-numbers].TheNumber
HAVING ((([tbl-price_list].[price-autoid])=2));
Avatar billede bodekaer Nybegynder
21. oktober 2002 - 13:57 #12
"Join expression not supported" siger den...

Men kan man godt lave Cross joins med grouping på?
21. oktober 2002 - 14:07 #13
hmm, jeg har lavet en simpelt eks. her, som virker:

SELECT Persontabel.PersonID, Sum(Persontabel.LønID) AS Løn, TheNumber
FROM [tbl-numbers], Persontabel
GROUP BY Persontabel.PersonID, [tbl-numbers].TheNumber;

Persontabel indeholder 8 PersonID'er og [tbl-Numbers] indeholder 5000.

Ialt kommer der 40.000 poster ud.
Avatar billede proaccess Nybegynder
21. oktober 2002 - 14:14 #14
Det som IKKE er understøttet er brug af cross join, og derefter Right join...

Løsning:

Lav dit crossjoin som en selvstøndig forespørgsel, og brug så denne i din "færdige" førespørgsel...
21. oktober 2002 - 14:17 #15
Hvad fa'en, Proaccess! Det er første gang, jeg har set dig foreslå at man splittede en query op i 2.
Du plejer da ellers at være mand for at kunne strikke 38 queries sammen til én :o)
Avatar billede bodekaer Nybegynder
21. oktober 2002 - 14:17 #16
Ahh, jeg har dog fundet en midlertidig løsning...

Jeg opretter et felt i begge de to tabeller og giver dem værdien 1 ... eller 0

og så kan jeg bruge en normal join på dem... bare lidt underligt at man skal lave et felt hvis formål er at joine to tabeller... :)
Avatar billede proaccess Nybegynder
21. oktober 2002 - 14:19 #17
>thomas:  ** LOL **
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester