Avatar billede theskye Nybegynder
20. juni 2006 - 16:23 Der er 6 kommentarer og
1 løsning

Select in select

Hej jeg har et sprøgsmål angående select in select.

Her er den query jeg gerne ville have til at fungere, men ved godt at den ikke kan udfører den korrekt.

select * from data where currentowner in (select userdesc from users where username = 'mol')

Følgende returnere "select userdesc from users where username = 'mol'":
('tma','bogholder')
Det er nogle statiske værdier jeg har sat ind, og nogle jeg gerne vil kunne bruge i min sql streng for at kunne vælge noget indhold i tabellen data.

username = 'mol' er blot en statisk forespørgsel jeg har sat ind for at teste med, da den skal virke dynamisk på alle brugere.

så det eneste jeg gerne vil vide er om der er mulighed for at pille tekst ud af min returnerede select for herefter at kunne splitte denne på evt et ",".

Det skal være i samme sql sætning da vores program hvor jeg skal bruge slq sætningen kun tager imod en sætning.
Avatar billede lorentsnv Nybegynder
21. juni 2006 - 10:43 #1
Det skulle kunne lade sig gøre. Du skal bare sørge for at den inderste SQL returnerer rigtig string i forhold til din yderste SQL. Med udgangspunkt i din string 'tma','bogholder'; hvis currentowner vil have 'tma', kunne du bruge følgende sql

select * from data where currentowner in (select left(userdesc ,charindex(',',userdesc )-1)from users where username = 'mol')

Hvis du ikke har plingere ('') med i currentowner, må du sørge for at få disse også fjærnet fra din inderste sql. I så tilfælde, hvis det altid er første del af userdesc du skal bruge, og du ved du skal have indholdet fra første pling (') til anden pling, kan du bruge en kombination af subsring og charindex til at hente ud ønsket tekst.
select
Avatar billede theskye Nybegynder
22. juni 2006 - 07:57 #2
min yderste select skal hente * fra data på alle de værdier der returneres af min inderste select. Det vil i dette tilfælde sige både tma og bogholder, men der kunne sagtens være flere på listen.
Avatar billede ldanielsen Nybegynder
22. juni 2006 - 09:57 #3
Det rigtige vil være at bruge INNER JOIN:

SELECT users.* FROM data
INNER JOIN users ON
data.currentowner = users.userdesc
WHERE users.username = 'mol'

Og husk så at undgå * i det færdige, det er meget bedre at skrive hvilke felter man faktisk har brug for.
Avatar billede lorentsnv Nybegynder
22. juni 2006 - 10:27 #4
Hvis jeg forstår dig rigtig, kan du ikke bruge join i dette tilfælde, da du har en en-til-mange relation mellem data.currentowner og users.userdesc. Dessuden har du vel også behov for at rense teksten i users.userdesc.

Det du ønsker er ikke så nemt at klare med SQL alene, da du har behov for en recursiv handling som løber igennem users.userdesc, og finder hvor mange navn (som tma og bogholder) der findes i users.userdesc.

Forstår jeg dig rigtig, når jeg tror at antal brugernavn i feltet userdesc kan variere? Hvis det varierer, og der kan være mange 'brugernavn' i feltet, har du behov for en recursiv funktion vil jeg mene. Det findes mulighed for recursiv funktion i SQL Server 2005, men ikke i 2000 og 7.0.

Alternativet er at normalisere din users tabel.
Avatar billede theskye Nybegynder
26. juni 2006 - 09:27 #5
Ja det er korrekt lorentsnv, antallet kan variere. Du har fat i det helt rigtige, og ja det er en MS SQL Server 2005.

Da det er en udvidelse til et eksisterende produkt som vi har, er det ikke muligt at ændre i databasestrukturen, ikke uden at ændre i vores program ligeledes... Hvilket ikke er en mulighed.

Du siger at der findes en løsning, en du kan bikse sammen, eller evt. give mig et hint til hvordan skal se ud?
Avatar billede theskye Nybegynder
26. juni 2006 - 16:13 #6
Update!

Det er kun en SQL Server 2000

Er der en mulighed alligevel?
Avatar billede theskye Nybegynder
23. marts 2011 - 14:19 #7
lukning af gammel sag.
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
Computerworld tilbyder specialiserede kurser i database-management

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