|  | 		    
					
        
         
          
         
	
          | |  | 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    |  |  | 
 |  |