Avatar billede difn Nybegynder
09. marts 2003 - 13:46 Der er 26 kommentarer og
1 løsning

forespørgsel

Hvordan laver man sin forespørgsel så det kun er en tuble for hver hits der bliver returneret. Jeg må hellere komme med et eksempel.

Jeg har et salgssystem. Et salg består af en salgslinie, hvorpå der er referencer til varer. Altså er der tre tabeller. salgslinien referere til vareid, og salgid. En vare kan godt ligge flere gange på hvert salg, altså kan man købe to liter mælk, og så senere på samme 1 liter.
Her kommer spørgsmålet så, hvordan laver jeg en sql sætning hvor jeg søger på mælks, vareid i salgslinien, og kun for returneret alle de salg hvor den forekommer, og kun for hvert salgsid ud en gang. Det vil sige at hvis der allerede er fundet en med salgid 2, så skal der ikke findes en til med dette, selvom der er 20 linier mere hvorpå der er solgt mælk.

På forhånd tak
Avatar billede hekla Nybegynder
09. marts 2003 - 13:52 #1
Se http://www.eksperten.dk/spm/312672. Det er det samme spørgsmål:
Avatar billede difn Nybegynder
09. marts 2003 - 14:06 #2
ja, men når jeg kører dette får jeg kun et output, den øverste, og ikke alle.
Avatar billede hekla Nybegynder
09. marts 2003 - 14:17 #3
Du kan også lave den med:

SELECT DISTINCT salgid FROM table WHERE vareid = "mælks varenummer"
Avatar billede hekla Nybegynder
09. marts 2003 - 14:21 #4
Er det fordi, du have en sammentælling af antal liter mælk der er solgt for hver salgsid?
Avatar billede difn Nybegynder
09. marts 2003 - 14:22 #5
hvad gør distinct, jeg har nemlig prøvet det, men jeg ved ikke helt om det virker...der kommer stadig fire ud først med salgsid 1, og 2 med salgsid 2....
Avatar billede hekla Nybegynder
09. marts 2003 - 14:38 #6
Distinct viser hver salgid én og kun én gang.
Avatar billede difn Nybegynder
09. marts 2003 - 14:42 #7
hmm det forstår jeg ikke. Men her har du min query, hvad er der galt

SELECT  [SideTabel].[Id], [SideTabel].[Url], [SideTabel].[Crawled], [DelSideTabel].[OrdId], [DelSideTabel].[position]

FROM SideTabel INNER JOIN DelSideTabel ON [SideTabel].[Id]=[DelSideTabel].[SideId]
WHERE ((([DelSideTabel].[OrdId])=4));
Avatar billede difn Nybegynder
09. marts 2003 - 14:51 #8
distinct i dette tilfælde virker kun hvis det kun er [SideTabel].[Id] alene. Men resten skal jo sådan set også være distinct, men hvis man skriver det foran disse kommer der en fejl
Avatar billede hekla Nybegynder
09. marts 2003 - 14:52 #9
Det kan jeg ikke gennemskue. Sorry!
Avatar billede difn Nybegynder
09. marts 2003 - 14:52 #10
jeg har stillet det samme spørgsmål her, det kan være det er nemmere at forstå.. http://www.experts-exchange.com/Databases/MS_Access/Q_20543942.html
Avatar billede sjap Praktikant
09. marts 2003 - 14:59 #11
Så vidt jeg lige kan se, så skal nedenstående da virke. Hvad er det for en fejl du får, når du bruge DISTINCT?

SELECT DISTINCT Sidetabel.Id, Sidetabel.Url, Sidetabel.Crawled, Delsidetabel.OrdId, Delsidetabel.position
FROM Sidetabel INNER JOIN Delsidetabel ON Sidetabel.Id = Delsidetabel.SideId
WHERE (((Delsidetabel.OrdId)=4));
Avatar billede difn Nybegynder
09. marts 2003 - 15:02 #12
det er ingen fejl, men jeg får dette ud..

Id  Url                                  Crawled      OrdId    Position
1      http://www.difn.dk/index.html        1          4        23
1      http://www.difn.dk/index.html        1          4        54
1      http://www.difn.dk/index.html        1          4        754
1      http://www.difn.dk/index.html        1          4        3422
1      http://www.difn.dk/index.html        1          4        4222
2      http://www.difn.dk/felagid.html      1          4        2
2      http://www.difn.dk/felagid.html      1          4        54
2      http://www.difn.dk/felagid.html      1          4        234
3      http://www.difn.dk/pogm.html          1          4        43

derfor kan det godt være at jeg skal bruge exist, hvis der er nogen der har styr på dette derude
Avatar billede hekla Nybegynder
09. marts 2003 - 15:07 #13
Det giver vel heller ikke mening at spørge efter én række med SalgId og så samtidig tage de andre ting med, når de er forskellige fra post til post med det samme SalgId???
Avatar billede hekla Nybegynder
09. marts 2003 - 15:08 #14
Problemet er Position. Når du spørger på Distinct og tager Position med, får du naturligvis alle de unikke kombinationer af SalgId og Position!
Avatar billede sjap Praktikant
09. marts 2003 - 15:09 #15
Eftersom Position ikke er den samme værdi i en gruppe, giver det ikke mening at inkludere den i forespørgslen.
Avatar billede sjap Praktikant
09. marts 2003 - 15:10 #16
Jeg er enig med hekla: fjern position fra forespørgslen, så får du det du ønsker:

SELECT DISTINCT Sidetabel.Id, Sidetabel.Url, Sidetabel.Crawled, Delsidetabel.OrdId
FROM Sidetabel INNER JOIN Delsidetabel ON Sidetabel.Id = Delsidetabel.SideId
WHERE (((Delsidetabel.OrdId)=4));
Avatar billede difn Nybegynder
09. marts 2003 - 15:17 #17
ja, men det er det der er problemet, det er nemlig den første position fra en side som jeg vil returnere. Så det er det der er problemet.
Avatar billede sjap Praktikant
09. marts 2003 - 15:19 #18
Så prøv med

SELECT DISTINCT Sidetabel.Id, Sidetabel.Url, Sidetabel.Crawled, Delsidetabel.OrdId, First(Delsidetabel.position) AS FirstOfposition
FROM Sidetabel INNER JOIN Delsidetabel ON Sidetabel.Id = Delsidetabel.SideId
GROUP BY Sidetabel.Id, Sidetabel.Url, Sidetabel.Crawled, Delsidetabel.OrdId
HAVING (((Delsidetabel.OrdId)=4));
Avatar billede difn Nybegynder
09. marts 2003 - 15:25 #19
Tak, det virker. Også tak for svaret til dig hekla. men hvorfor skal man bruge group(hvad er det) og hvordfor skal man bruge having istedet for where...
Avatar billede difn Nybegynder
09. marts 2003 - 15:32 #20
en andet problem kan ses her http://www.eksperten.dk/spm/326380
Avatar billede sjap Praktikant
09. marts 2003 - 15:33 #21
GROUP bruges fordi du samler dine data i en gruppe, hvor du kun vil have ét tal til at repræsentere gruppen. I dette tilfælde grupperer du efter Id, Irl, Crawled, OrdId og den første forekomst af Position.

Vedr. HAVING bliver jeg dig svar skyldig. Jeg ved ikke hvorfor det ændres fra WHERE til having (det er noget Access selv fandt på). Men det virker i denne sammenhæng som WHERE gjorde før.

Nu ved jeg ikke om den første position på siden altid ligger først i din tabel. Hvis dette ikke er tilfældet skal du måske ændre SQL'en til (Funktionen First er ændret til Min for at finde den laveste værdi):

SELECT DISTINCT Sidetabel.Id, Sidetabel.Url, Sidetabel.Crawled, Delsidetabel.OrdId, Min(Delsidetabel.position) AS FirstPosition
FROM Sidetabel INNER JOIN Delsidetabel ON Sidetabel.Id = Delsidetabel.SideId
GROUP BY Sidetabel.Id, Sidetabel.Url, Sidetabel.Crawled, Delsidetabel.OrdId
HAVING (((Delsidetabel.OrdId)=4));
Avatar billede difn Nybegynder
09. marts 2003 - 15:43 #22
ok, tak skal du have
Avatar billede hekla Nybegynder
09. marts 2003 - 16:09 #23
Tak for point :o(
Avatar billede difn Nybegynder
09. marts 2003 - 16:36 #24
jeg kan ikke give dig point hekla, jeg syntes også at det er lidt trist at jeg ikke kan give dig lidt for at have svaret, men superjap havde det rigtige svar og derfor mener jeg jo at han skal have point..
Avatar billede hekla Nybegynder
09. marts 2003 - 16:40 #25
Man kan godt dele pointene mellem flere svar, hvis du trykker avanceret ved siden af svarknappen. Jeg hjalp dig trods alt et godt stykke af vejen.
Avatar billede difn Nybegynder
10. marts 2003 - 08:36 #26
det vidste jeg ikke...sorry
Avatar billede difn Nybegynder
11. marts 2003 - 11:01 #27
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