20. juni 2006 - 16:23Der 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.
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
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.
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.
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?
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.