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

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
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




Søg
Reklame
Statistik
Spørgsmål : 177502
Tips : 31968
Nyheder : 719565
Indlæg : 6408534
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste