Avatar billede roadrunr Nybegynder
08. februar 2001 - 10:20 Der er 26 kommentarer og
3 løsninger

SQL: SELECT(inner SELECT)

Jeg har i nogen ASP-scripts set at man inde i en SELECT-sætning kan have endnu en \"SELECT\". I hvilke tilfælde bruger man det? - hvad er fordelen?
Avatar billede sone Nybegynder
08. februar 2001 - 11:17 #1
Man kunne f.eks. have sætningen:

  SELECT antal, id FROM (SELECT COUNT(id) as antal, id FROM tabel GROUP BY id) WHERE antal>1

så finder den de id-numre som er benyttet mere end én gang. Man kunne også forestille sig at man skal lave JOIN mellem 2 tabeller, men man vil kun have nogle af posterne med fra den ene tabel:

  SELECT * FROM tabel1 t1, tabel2 t2 WHERE t1.id=t2.id AND t1.nummer NOT IN (SELECT nummer FROM tabel2 WHERE felt=\'x\')
Avatar billede roadrunr Nybegynder
08. februar 2001 - 11:36 #2
Jeg har en tabel(tbl_Brugere), som indeholder \"brugerid\", \"brugernavn\", \"adgangskode\".

BrugerID | Brugernavn| Adgangskode |
---------|-----------|-------------|
1        | user1    | Pass1      |
---------|-----------|-------------|
2        | user2    | Pass2      |
---------|-----------|-------------|

Selve brugeroplysningerne har jeg liggende i en anden tabel(tbl_BrugerInfo), som indeholder \"brugerid\", \"InfoNavn\", \"InfoValue\".

I \"tbl_BrugerInfo\" har jeg lister brugerinformationerne således:

BrugerID | InfoNavn  | InfoValue |
---------|-----------|-----------|
1        | Fornavn  | Martin    |
---------|-----------|-----------|
1        | Efternavn | Hansen    |
---------|-----------|-----------|
2        | Fornavn  | Anders    |
---------|-----------|-----------|
2        | Efternavn | Olsen    |
---------|-----------|-----------|

Kan man så gøre sådan så at jeg kan lave en forespørgsel i \"tbl_Brugere\", som så går ind i \"tbl_BrugerInfo\" og bruger henholdsvis \"Fornavn\" og \"Efternavn\" som kolonneoverskrifter. Så at når jeg udskriver brugerene på en liste vil det se ud som følgende.

BrugerID | ForNavn  | Efternavn | Brugernavn | Adgangskode |
---------|-----------|-----------|------------|-------------|
1        | Martin    | Hansen    | user1      | pass1      |
---------|-----------|-----------|------------|-------------|
2        | Anders    | Olsen    | user2      | pass2      |
---------|-----------|-----------|------------|-------------|

På den måde skulle jeg også gerne kunne ORDER BY henholdvis \"BrugerID\", \"Fornavn\" eller \"Efternavn\". Kan dette lade sig gøre, eller det helt umuligt. Jeg smider gerne X-ANTAL(100) POINT oveni hvis det kan komme til at virke.

Avatar billede roadrunr Nybegynder
08. februar 2001 - 11:37 #3
Nå det kom ikke til at se så pænt ud - men håber det kan gennemskues.
Avatar billede sone Nybegynder
08. februar 2001 - 12:39 #4
Jeg kigger lige på det - så kan du jo dobble point i mens...
Avatar billede roadrunr Nybegynder
08. februar 2001 - 12:45 #5
Det skal siges at antallet af bruger informationer i \"tbl_BrugerInfo\" kan/skal være dynamisk(n).
Avatar billede sone Nybegynder
08. februar 2001 - 12:46 #6
SELECT b.brugerid, f.infovalue as fornavn, e.infovalue as efternavn, b.brugernavn, b.adgangskode FROM tbl_brugere b, (SELECT brugerid, infovalue FROM tbl_brugerinfo WHERE infonavn=\'fornavn\') f, (SELECT brugerid, infovalue FROM tbl_brugerinfo WHERE infonavn=\'efternavn\') e WHERE b.brugerid=f.brugerid AND b.brugerid=e.brugerid
Avatar billede roadrunr Nybegynder
08. februar 2001 - 12:57 #7
Følger der en lille forklaring med? (se venligst min seneste kommentar)
Avatar billede sone Nybegynder
08. februar 2001 - 13:11 #8
En ting er sikkert - jo længere du laver sætningen (jo flere du putter på), jo langsommere bliver det at udføre.
Hvis du vil have det helt dynamisk kan du hente de forskellige felter fra tbl_brugerinfo, og så opbygge sætningen dynamisk.
Avatar billede roadrunr Nybegynder
08. februar 2001 - 13:45 #9
jeg kan i helt forstå hvordan du bruger variablerne \"f\" og \"e\". Fordi hvis jeg skal lave den 100% dynamisk - så kan jeg jo ikke benytte mig af: a,b,c,d,e,f,g..... x,z?
Avatar billede sone Nybegynder
08. februar 2001 - 13:50 #10
De skal bare hedde et eller andet: a1, a2, a3, ...
Avatar billede ricki Nybegynder
08. februar 2001 - 13:59 #11
Var det ikke en meget handikappet måde at gemme dine data på?
Jeg vil mene at det ville være mere hensigt mæsssigt at gemme det hele i den tabel, med mindre du har nogle brugerId\'er der ikke har noget navn eller efternavn, eller igen af delene. Rent preformens mæssigt er det utroligt langsomt og resourcekrævende at bruge \"inner-select\".
Avatar billede ricki Nybegynder
08. februar 2001 - 14:05 #12
I øvrigt er det måske også en lidt dårlig løsning med denne sone\'s forslag, da det kan klares med mogle joins som er væsenligt hurtigere.

Jeg ville foreslå dette:

SELECT b.brugerid, f.infovalue as fornavn, e.infovalue as efternavn, b.brugernavn, b.adgangskode FROM tbl_brugere b, tbl_brugerinfo  f, tbl_brugerinfo e WHERE b.brugerid=f.brugerid AND b.brugerid=e.brugerid

-Og så igen, så ville man kunne hente en del ved at samle datane i en tabel hvis der alligevel altid er både et fornavn og et efternavn til hver brugerId
Avatar billede ricki Nybegynder
08. februar 2001 - 14:09 #13
hov, jeg glemte lige noget og så skrev du også at du ville have dem sorteret...
-Tilføj dette bagefter det jeg skrev før:

f.infonavn=\'fornavn\' AND e.infonavn=\'efternavn\' ORDER BY b.brugerid, e.infovalue, f.infovalue
Avatar billede ricki Nybegynder
08. februar 2001 - 14:11 #14
Jeg kommer også lige til at se at du bruger store startbogstaver på feltnavne, det kan godt være du lige skal rette dem for at det virker. -Også lige på \'fornavn\' og \'efternavn\'
Avatar billede sone Nybegynder
08. februar 2001 - 14:12 #15
ricki: Nu holder vi... jeg har lavet på request fra roadrunr.

For det andet, så giver din sætning følgende resultat:

brugerid    fornavn    efternavn    brugernavn    adgangskode
1    Martin    Martin    user1    pass1
1    Martin    Hansen    user1    pass1
1    Hansen    Martin    user1    pass1
1    Hansen    Hansen    user1    pass1
2    Anders    Anders    user2    pass2
2    Anders    Olsen    user2    pass2
2    Olsen    Anders    user2    pass2
2    Olsen    Olsen    user2    pass2

og det er jo ikke lige det der blev bedt om vel !
Avatar billede sone Nybegynder
08. februar 2001 - 14:12 #16
... lavet det på ...
Avatar billede roadrunr Nybegynder
08. februar 2001 - 14:28 #17
ricki: Den version af mit system som er præsenteret her på siden er i realiteten meget simplificeret. I virkeligheden består mine brugeroplysninger af 6 tabeller, som ikke indeholder andet end ganske almindelige brugerdata. Jeg vil godt give dig ret i at det \"rent preformance-mæssigt\" ville være meget nemmere at gemme oplysningerne i samme tabel, hvilket jeg allerede har forsøgt med. Problemet er at brugerne er inddelt i forskellige brugergrupper. Informationerne på brugerene blandt brugergrupperne er forskellige. Samtidig så skal brugerene have mulighed for at indtaste individuelle informationer. Hvis det skulle have fungeret på den gamle måde, så skulle jeg bruge ALTER TABLE for at tilføje nye kolonner i tabellen hver gang der en bruger ville tilføje nye informationer. På den nye måde bliver informationerne mere dynamiske, samtidig med at jeg har mulighed for at lagre data\'ne med den rigtige datatype, og på den måde spare plads.
Den eneste ulempe ved metoden, er at det er svært at udskrive informationerne på en hurtig og præsentabel måde. Men det er jo det jeg behøver jeres hjælp til.
Avatar billede kasseper Nybegynder
08. februar 2001 - 14:36 #18
Du kunne også være smart og lave views, istedet for indlejrede selects....
Som du selv siger har du 6 tabeller du skal bruge data fra, hvis du laver et view, kan du benytte det som udtræk fra en tabel, men det er performance mæssigt meget bedre....
Avatar billede ricki Nybegynder
08. februar 2001 - 14:39 #19
Sone: Har du også tilføjet det jeg skrev i beskeden lige efter?

(Jeg havde ikke selv testet det)

Forresten hvad er det der gør dig mere berettiget til at svare på dette spørgsmål end mig?
Avatar billede ricki Nybegynder
08. februar 2001 - 14:42 #20
Roadrunr: Hvis dine du har forskellige data om forskellige brugere er det korrekt at det ikke er smart at have det i en tabel, men skal undgå at have kolonner hvor der er felter der er tomme. Men jeg syntes din løsning er lidt dårlig, jeg ville dele mine brugere op i nogle grupper og så have en tabel for hver gruppe, men disse tabeller skulle så kun indeholde de data der er til forskel fra de andre. -Hvis du forstår mig
Avatar billede roadrunr Nybegynder
08. februar 2001 - 14:53 #21
Ricki: det lyder såmen meget smart. Men jeg ville bare gerne uden om det der med at skulle til at oprette, ændre, slette tabeller og kolonner. Fordi én af de ting jeg syntes der er klondset ved din løsning, er hvis hvis f.eks. du ville have kolonnerne præsenteret i en anden rækkefølge el.lign. Så skal man jo igang med en masse omflytning af data. Men jow, jeg kan godt forstå dit argument.
Avatar billede sone Nybegynder
08. februar 2001 - 15:01 #22
Ricki: Jeg er da ikke mere berettiget end andre (jeg læste måske dit indlæg lidt skævt...)
Avatar billede ricki Nybegynder
08. februar 2001 - 15:18 #23
Roadrunr: Hvis du vil hvade det, vil jeg da godt kikke på din datamodel og se om den ikke kan optimeres. Jeg vil tror der er noget galt i din datamodel hvis du skal til at oprette og nedlægge kolonner i din kode, det virker ikke særligt hensigtmæssigt. Og den løsning du har fundet tror jeg heller ikke på er den bedste.
-Din problemstillig lyder meget spændene og jeg vil da gerne hjælpe dig med at løse den hvis du vil.
Avatar billede ricki Nybegynder
08. februar 2001 - 15:21 #24
Sone: Okay, jeg syntes bare du lød så sur :-)
-Troede du var en af de der irreterende point griske brugere, der ikke svare fordi de vil hjælpe et medmenneske, men fordi de kan få nogle point.
Avatar billede roadrunr Nybegynder
08. februar 2001 - 15:29 #25
ricki: har du en adresse jeg kan sende til?
Avatar billede ricki Nybegynder
08. februar 2001 - 15:49 #26
ricki@ricki.dk
Avatar billede ricardo Nybegynder
09. februar 2001 - 19:42 #27
Dine tabeller burde lægges sammen, da modellen er forfejlet. Hvis du beholder samme model, burde du også have et separat primær nøgle i en af dem, og i den burde \'brugerid\' optræde som fremmed nøgle, dvs. som en relation.

Men anyway:

sql = \"select t.brugerid, t.brugernavn, i.InfoNavn, i.InfoValue from tbl_bruger t inner join tbl_Brugerinfo i on i.brugerid = t.brugerid\"

burde løs dit problem foreløbigt.
Avatar billede ricardo Nybegynder
09. februar 2001 - 19:44 #28
Ups - adgangskoden skal også med:

sql = \"select t.brugerid, t.brugernavn,t.adgangskode, i.InfoNavn, i.InfoValue from tbl_bruger t inner join tbl_Brugerinfo i on i.brugerid = t.brugerid\"

Avatar billede roadrunr Nybegynder
27. maj 2001 - 11:20 #29
Takker venligst for deltagelsen, dog løste det ikke helt mit problem.
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
Kurser inden for grundlæggende programmering

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