Avatar billede dex_dexter Nybegynder
27. april 2005 - 10:41 Der er 8 kommentarer og
1 løsning

subquery problem

jeg har denne stump sql:
declare @users int
declare @use int
declare @id int
set @id = 218
set @users =(select users from features where featureid = @id)
set @use =(select count(*) from leases where id = @id)

select @id as id, @users as users, @use as use

som virker fint, jeg får et rowset ud med de data jeg gerne vil have ud, men nu vil jeg gerne have det udvidet.
jeg har en anden tabel hvor i der står en masse id´s, og jeg vil gerne lave en select id from idtable og så køre overstående stump for hver record i idtable, men stadig have det hele sendt ud som et enkelt rowset.

men hvordan får jeg det gjort?
Avatar billede ldanielsen Nybegynder
27. april 2005 - 11:13 #1
Har du overvejet en function?
Avatar billede dex_dexter Nybegynder
27. april 2005 - 11:23 #2
jeg har lavet en stored procedure som bare skal kaldes med mysp og så id´et
altså
mysp id

hvis det er det du mener? jeg har aldrig brugt deciderede functions
Avatar billede dex_dexter Nybegynder
27. april 2005 - 11:24 #3
men hvordan får jeg sql´en til at køre den sp for hver række? og ikke mindst, hvordan får jeg det ud som et enkelt rowset?
Avatar billede herman01753 Nybegynder
27. april 2005 - 11:41 #4
du skla bruge en cusor. du kan læse om dem i books online dokumentationen, der er eksemler på hvordan de virker.

et eksempel kan være følgende:

declare @users int
declare @use int
declare @id int
DECLARE my_Cursor CURSOR FOR
SELECT id
FROM [din tabel]
WHERE [Din where clause]


OPEN my_Cursor

FETCH NEXT FROM my_Cursor into @id
WHILE @@FETCH_STATUS = 0
BEGIN

set @users =(select users from features where featureid = @id)
set @use =(select count(*) from leases where id = @id)

    FETCH NEXT FROM my_Cursor
END

CLOSE my_Cursor
DEALLOCATE my_Cursor
Avatar billede herman01753 Nybegynder
27. april 2005 - 11:43 #5
hvis du så gerne vil have det hele i et query, kan du jo oprette en midlertidig tabel, som du indsætter data i, og afsluttende laver en select * på. herefter nedlægger du tabellen igen. på den måde vil du få det ønskede resultat
Avatar billede dex_dexter Nybegynder
27. april 2005 - 12:19 #6
der må være en anden måde at samle det på, det er ikke holdbart at jeg skal til at oprette nye tabeller, jeg koder til et webinterface, så der vil komme flere brugere på sitet på samme tid.
Avatar billede ldanielsen Nybegynder
27. april 2005 - 16:11 #7
En function er næsten det samme som en sp. Blot kan den netop det du efterlyser, kan kaldes fra hver række:

CREATE FUNCTION dbo.f_GetUse(@ID int)
RETURNS int
AS 
BEGIN
DECLARE @use int
select @use = count(*) from leases where id = @id
RETURN @use
END


CREATE FUNCTION dbo.f_GetUsers(@ID int)
RETURNS int
AS 
BEGIN
DECLARE @users int
select @users = users from features where featureid = @id
RETURN @users
END


Derefter kan du:

select id, dbo.f_GetUsers(id) as users, dbo.f_GetUse(id) as use FROM idtable

- Hvis jeg altså har forstået dig rigtigt
Avatar billede ldanielsen Nybegynder
27. april 2005 - 16:14 #8
Hvis dette er rigtigt, så kan man faktisk gøre det sådan:

select idtable.id, (select features.users from features where features.featureid = idtable.id) as users, (select leases.use from leases where leases.featureid = idtable.id) as use FROM idtable
Avatar billede dex_dexter Nybegynder
28. april 2005 - 12:07 #9
lavede min databasestruktur om så jeg kunne gøre det en del simplere
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