09. marts 2003 - 13:46Der 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.
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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....
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
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???
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));
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...
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));
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..
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.