|
| Fjerne dubletter fra resultat af SQL forsp~ Fra : :o\) |
Dato : 11-03-03 20:33 |
|
Hej NG
Jeg skal lave et db udtræk med SQL. Det driller. Jeg prøver noget med:
SELECT kunder.fornavn
FROM kunder, forhandlere
WHERE kunder.efternavn LIKE forhandlere.efternavn
Det giver mig alle fornavnene på kunder, der har samme efternavn som en
forhandler. Men jeg ønsker kun et _sæt_ af fornavne. Forskel: Hvis der er to
kunder der hedder "ole" til fornavn, og har et efternavn magen til en
forhandler, så får jeg "ole" ud to gange. Jeg ønsker at få fjernet
dubletterne, så jeg kun får de _forskellige_ fornavne.
Hvordan kan dette laves i en SQL streng? (Eller på andre måder)
(Er det korrekt at bruge LIKE til sammenligninger?)
| |
Abel (11-03-2003)
| Kommentar Fra : Abel |
Dato : 11-03-03 20:35 |
|
select distinct.....
--
mvh.
Henrik Abel Larsen
abel@xperiment[prik].dk
www.xperiment.dk
" " <p_ole@mobilixnet.nospam.dk> wrote in message
news:QRqba.118888$Hl6.11011093@news010.worldonline.dk...
> Hej NG
>
> Jeg skal lave et db udtræk med SQL. Det driller. Jeg prøver noget med:
>
> SELECT kunder.fornavn
> FROM kunder, forhandlere
> WHERE kunder.efternavn LIKE forhandlere.efternavn
>
> Det giver mig alle fornavnene på kunder, der har samme efternavn som en
> forhandler. Men jeg ønsker kun et _sæt_ af fornavne. Forskel: Hvis der er
to
> kunder der hedder "ole" til fornavn, og har et efternavn magen til en
> forhandler, så får jeg "ole" ud to gange. Jeg ønsker at få fjernet
> dubletterne, så jeg kun får de _forskellige_ fornavne.
>
> Hvordan kan dette laves i en SQL streng? (Eller på andre måder)
>
> (Er det korrekt at bruge LIKE til sammenligninger?)
>
>
| |
Jakob Andersen (11-03-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 11-03-03 20:37 |
|
" " <p_ole@mobilixnet.nospam.dk> wrote
> Det giver mig alle fornavnene på kunder,
> der har samme efternavn som en forhandler.
> Men jeg ønsker kun et _sæt_ af fornavne.
DISTINCT bruges i SQL til kun at hente unikke værdier, f.eks.:
SELECT DISTINCT k.fornavn
FROM kunder k , forhandlere f
WHERE k.efternavn = f.efternavn
> (Er det korrekt at bruge LIKE til sammenligninger?)
Du bør istedet bruge "=" operatoren, LIKE bruges når man skal søge med et
såkaldt pattern. (Du må dog ikke hænge mig op på at der er forskel i
hastigheden, men jeg syntes umiddelbart at det er pænere at bruge "=" når
det er en helt basal sammenligning)
--
Jakob Andersen
| |
:o\) (11-03-2003)
| Kommentar Fra : :o\) |
Dato : 11-03-03 21:15 |
|
> DISTINCT bruges i SQL til kun at hente unikke værdier
Hmm det giver ikke det resultat jeg ønsker. Det ser ikke ud til at have
nogen virkning.
Uden parallelteksemplet med for- og efternavne, så ser min situationen sådan
ud:
SELECT DISTINCT b.Type, b.ID
FROM Tilhehør b, Produkter e
WHERE b.Eksempel LIKE e.ID
ORDER BY Eksempler.Nummer
ORDER BY ser heller ikke ud til at virke med DESTINCT. Hvilket vel også er
logisk nok.
>> (Er det korrekt at bruge LIKE til sammenligninger?)
> Du bør istedet bruge "=" operatoren
Det giver en fejl:
"Type mismatch in expression."
| |
Jakob Andersen (11-03-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 11-03-03 21:59 |
|
" " <p_ole@mobilixnet.nospam.dk> wrote
> Hmm det giver ikke det resultat jeg ønsker. Det ser ikke ud til at have
> nogen virkning.
DISTINCT er mig bekendt implementeret i de mest gængse databaser, læs evt
mere om brugen her:
< http://www.w3schools.com/sql/sql_distinct.asp>
> SELECT DISTINCT b.Type, b.ID
> FROM Tilhehør b, Produkter e
> WHERE b.Eksempel LIKE e.ID
> ORDER BY Eksempler.Nummer
>
> ORDER BY ser heller ikke ud til at virke med
> DESTINCT. Hvilket vel også er logisk nok.
Du refererer til en objekt med navnet Eksempler men dette er ikke i din
liste i FROM, det kan være derfor at din sortering ikke virker.
> "Type mismatch in expression."
Okay, så er det fordi du sammenligner datatyper af forskellig typer, f.eks.
en streng med et heltal. Hvis dette ikke er bevist skal du lige have tjekket
typerne i din tabel.
--
Jakob Andersen
| |
:o\) (12-03-2003)
| Kommentar Fra : :o\) |
Dato : 12-03-03 00:05 |
|
> > SELECT DISTINCT b.Type, b.ID
> > FROM Tilhehør b, Produkter e
> > WHERE b.Eksempel LIKE e.ID
> > ORDER BY Eksempler.Nummer
> >
> > ORDER BY ser heller ikke ud til at virke med
> > DESTINCT. Hvilket vel også er logisk nok.
>
> Du refererer til en objekt med navnet Eksempler men dette er ikke i din
> liste i FROM, det kan være derfor at din sortering ikke virker.
Kan det ikke laves sådan, at den kun viser unikke versioner af b.Type og
b.ID, og hvor den så har sorteret dem, der skal vises, efter
Eksempler.Nummer?
Håber jeg gør mig forståelig.
Eksemplet fra før:
SELECT DISTINCT fornavn
FROM kunde, forhandler
WHERE kunde.efternavn = forhandler.efternavn
ORDER BY kunde.alder
De kunde fornavne der vises, de skal sortes efter deres alder. (Der kan være
flere der hedder "ole", men de er alle sammen yngre end dem der hedder
"jacob", og derfor skal de vises først...)
Alternativ: Sorter dem efter gennemsnitsalder... Er dette muligt?
På forhånd tak for hjælpen. Også den som jeg allerede har fået
| |
Jakob Andersen (12-03-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 12-03-03 00:23 |
|
" " <p_ole@mobilixnet.nospam.dk> wrote
> De kunde fornavne der vises, de skal sortes
> efter deres alder. (Der kan være flere der
> hedder "ole", men de er alle sammen yngre
> end dem der hedder "jacob", og derfor skal
> de vises først...)
> Alternativ: Sorter dem efter gennemsnitsalder...
> Er dette muligt?
Ja, det er muligt (Jeg kan ikke følge din reelle datastruktur så jeg holder
mig til dit eksempel), jeg vil anbefale dig at benytte en GROUP BY istedet
for (som Jens hvist også har nævnt) til at opnå din alternative løsning
SELECT k.fornavn, AVG(k.alder) AS gnmsalder
FROM kunde k, forhandler f
WHERE k.efternavn = forhandler.efternavn
GROUP BY k.fornavn
ORDER BY gnmsalder
Dog kan jeg ikke lige huske om Access understøtter at bruge tildelte
variabler(gnmsaklder) i WHERE/ORDER BY/GROUP BY hvis ikke skal du også kalde
AVG funktionen i ORDER BY.
Hvis du istedet for gennemsnittet ønsker den samlede alder for alle med
samme navne kan du bruge SUM funktionen istedet for AVG.
--
Jakob Andersen
| |
:o\) (12-03-2003)
| Kommentar Fra : :o\) |
Dato : 12-03-03 19:36 |
|
Det virker ikke i praksis. Jeg vil jo stadig kun have vist navnene "ole" og
"jacob" én gang hver, så jeg skal jo bruge DISTINCT til at fjerne dubletter.
Det giver fejl ved ORDER BY.
Kan man gøre noget?
> SELECT DESTINCT k.fornavn, AVG(k.alder) AS gnmsalder
> FROM kunde k, forhandler f
> WHERE k.efternavn = forhandler.efternavn
> GROUP BY k.fornavn
> ORDER BY gnmsalder
Giver fejlen:
"ORDER BY clause (gnmsalder) conflicts with DISTINCT."
> SELECT DESTINCT k.fornavn
> FROM kunde k, forhandler f
> WHERE k.efternavn = forhandler.efternavn
> GROUP BY k.fornavn
> ORDER BY AVG(k.alder)
Giver fejlen:
"ORDER BY clause (AVG(k.alder)) conflicts with DISTINCT."
| |
Jakob Andersen (12-03-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 12-03-03 20:48 |
|
" " <p_ole@mobilixnet.nospam.dk> wrote
> Det giver fejl ved ORDER BY.
Lad mig prøve at vise dig et gennemtestet eksempel, jeg har lige brygget det
på en allerede eksisternede database nemlig den der ligger bag
http://asp-faq/
Jeg benytter i mit udtræk to tabeller nemlig "faq" som hvori hver FAQ ligger
disse har bl.a. et felt hvori der står hvor mange gange denne artikel er
læst samen en kolonne hvori der specificeres hvilken kategori FAQ'en hører
under.
Den anden tabel er deiwasp som indeholder alle kategorierne der har et ID
nummer og en tekst.
For at lave et udtræk der giver os summen af artikellæsninger i hver
kategori kan jeg bruge denne SQL sætning hvori jeg sorterer efter antallet:
SELECT DISTINCT c.strCategoryName, SUM(f.intArticleViews) AS total
FROM faq f, cat c
WHERE c.id = f.intCategoryId
GROUP BY c.strCategoryName
ORDER BY total;
Og resultatet er:
+-------------------+------+
| strCategoryName | gnms |
+-------------------+------+
| Komponenter | 0 |
| Forms | 80 |
| XML | 118 |
| SQL | 181 |
| Dato,valuta,sprog | 259 |
| Filsystemet | 341 |
| Sikkerhed | 629 |
| Databaser | 984 |
| Generelt | 1377 |
+-------------------+------+
Håber du kan gennemskue det, jeg har ikke adgang til Access og kan derfor
ikke lige teste om det er denne der kommer til kort.
--
Jakob Andersen
| |
Torben Brandt (12-03-2003)
| Kommentar Fra : Torben Brandt |
Dato : 12-03-03 21:42 |
|
Jakob Andersen wrote:
> SELECT DISTINCT c.strCategoryName, SUM(f.intArticleViews) AS total
> FROM faq f, cat c
> WHERE c.id = f.intCategoryId
> GROUP BY c.strCategoryName
> ORDER BY total;
Der er ikke nogen grund til at bruge DISTINCT, når du bruger GROUP BY.
GROUP BY sørger for at der ikke er dubletter af strCategoriName.
/Torben
| |
Jakob Andersen (12-03-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 12-03-03 21:46 |
|
"Torben Brandt" <torben@actuar.dk> wrote
> Der er ikke nogen grund til at bruge DISTINCT,
> når du bruger GROUP BY.
> GROUP BY sørger for at der ikke er dubletter
> af strCategoriName.
For at citere en af de meget intelligente amerikanske tegneseriefigurer:
DOH!.
Jeg havde bare skrevet SQL forespørgslen af fra Oles indlæg og ændret tabel
og feltnanve.
--
Jakob Andersen
| |
Jens Gyldenkærne Cla~ (11-03-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 11-03-03 23:18 |
|
skrev:
>> DISTINCT bruges i SQL til kun at hente unikke værdier
> Hmm det giver ikke det resultat jeg ønsker. Det ser ikke ud
> til at have nogen virkning.
Distinct virker på alle felter i forespørgslen.
> SELECT DISTINCT b.Type, b.ID
Her får du derfor alle unikke kombinationer af Type og ID - hvor du
måske er ude efter at kun Type skal være unikt.
> ORDER BY Eksempler.Nummer
>
> ORDER BY ser heller ikke ud til at virke med DESTINCT. Hvilket
> vel også er logisk nok.
Jeg kan forestille mig at ORDER BY kun virker på felter der er med
i feltlisten når man bruger DISTINCT.
Du kan måske få mere ud af at bruge GROUP BY
>> Du bør istedet bruge "=" operatoren
> Det giver en fejl:
> "Type mismatch in expression."
Hvis Eksempel og ID er af forskellige typer skal du bruge typecast
for at sammenligne dem. LIKE er nok hurtigere at skrive - jeg skal
ikke kunne sige om der er nogen performanceforskel.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Chrisser (12-03-2003)
| Kommentar Fra : Chrisser |
Dato : 12-03-03 08:32 |
|
"Jakob Andersen" <jakob@effectus.dk> skrev i en meddelelse
news:b4leci$1haa$1@news.cybercity.dk...
> Du bør istedet bruge "=" operatoren, LIKE bruges når man skal søge med et
> såkaldt pattern. (Du må dog ikke hænge mig op på at der er forskel i
> hastigheden, men jeg syntes umiddelbart at det er pænere at bruge "=" når
> det er en helt basal sammenligning)
Der kan være kanonstor forskel i hastigheden på store tabeller. LIKE vil
ikke bruge et eventuelt index hvis den for eksempel er lavet på følgende
måde: navn LIKE '%hans%'.
Hvis det første procenttegn udelades vil et eventuelt index ofte blive
brugt.
Bortset fra det vil jeg give dig ret i at det ikke er pænt hvis man ligeså
godt kan bruge '='
Chrisser
| |
Henrik Petersen (11-03-2003)
| Kommentar Fra : Henrik Petersen |
Dato : 11-03-03 22:56 |
|
Hvis du har din database i access, så kan du lave den forspørgelse du gerne
vil have, med det ønskede resultat, så trykker du blot på den knap hvor der
er weiv, lige under filer, der er der oxo en scrolle down, lige til højre,
der kan du så trykke på SQL knappen og se forspørgelsen i SQL, så kan du
bare koien den over i dit asp....det gør jeg hvis der er noget der
driller.......
husk at fjerne " med '
henrik
" " <p_ole@mobilixnet.nospam.dk> wrote in message
news:QRqba.118888$Hl6.11011093@news010.worldonline.dk...
> Hej NG
>
> Jeg skal lave et db udtræk med SQL. Det driller. Jeg prøver noget med:
>
> SELECT kunder.fornavn
> FROM kunder, forhandlere
> WHERE kunder.efternavn LIKE forhandlere.efternavn
>
> Det giver mig alle fornavnene på kunder, der har samme efternavn som en
> forhandler. Men jeg ønsker kun et _sæt_ af fornavne. Forskel: Hvis der er
to
> kunder der hedder "ole" til fornavn, og har et efternavn magen til en
> forhandler, så får jeg "ole" ud to gange. Jeg ønsker at få fjernet
> dubletterne, så jeg kun får de _forskellige_ fornavne.
>
> Hvordan kan dette laves i en SQL streng? (Eller på andre måder)
>
> (Er det korrekt at bruge LIKE til sammenligninger?)
>
>
| |
:o\) (11-03-2003)
| Kommentar Fra : :o\) |
Dato : 11-03-03 23:57 |
|
> der kan du så trykke på SQL knappen og se forspørgelsen i SQL, så kan du
> bare koien den over i dit asp....det gør jeg hvis der er noget der
> driller.......
Det er smart
| |
|
|