Avatar billede dergruneskov Nybegynder
30. september 2003 - 12:54 Der er 4 kommentarer og
1 løsning

Tricky Sql

Hej I kloge jeg er ny her. Jeg har et spørgsmål som har drillet mig meget.

Jeg har flg tabeller med data i:

Tabel 1: Værdier
brugerFK TypeFK Værdi
-------- ------ ------
1        1      1000
1        2      2000
2        1      1500
2        2      2500

Tabel 2: Typer
ID  Beskrivelse
---- ------
1    Farve
2    Model

Tabel 3: Bruger
ID  Navn
---- ----------
1    Hans
2    Gerda


Jeg vil godt ende med flg:

Bruger  Beskrivelse
------- ------------------------
Hans    Farve: 1000, Model: 2000
Gerda  Farve: 1500, Model: 2500

Altså alle typer i en varchar kolonne for hver bruger.

Antallet af typer variere ligesom det ikke er alle brugere der har alle typer.

Jeg har forsøg mig med Cursers og andet men uden held - er der nogen der kan hjælpe mig.

Afvikles fra storedprocedure

/Skov
Avatar billede medions Nybegynder
30. september 2003 - 13:07 #1
SELECT værdier.*, Typer.*, Bruger.* FROM Værdier, Typer, Bruger WHERE Bruger.ID = Værdier.BrugerFK

//>Rune
Avatar billede dergruneskov Nybegynder
30. september 2003 - 16:20 #2
øhh Jeg ved ikke helt om jeg er dårlig til at forklare - Men den giver ikke et resultat som kan bruges. Det giver jo flg:

Navn  Type      Værdi
------ --------- -----
Hans  Farve    1000
Hans  Model    2000
Gerda  Farve    1500
Gerda  Model    2500

Ikke helt det jeg vil ha :-) Desuden kan det jo ikke lade sige gøre uden en eller anden form for join ???

Men tak for forsøget - håbet stadigvæk at der er flere kloge mennesker der har et bud :-)
Avatar billede bjornicle Nybegynder
30. september 2003 - 16:43 #3
Dette virker men er ikke smukt!

set nocount on
create table #t1 (id int, beskrivelse varchar(500))
declare @brugerid int
declare @vaerdi varchar(50)
declare @beskrivelse varchar(50)
declare @idExists int

declare vaerdier cursor for
select brugerFK, vaerdi, beskrivelse from værdier inner join typer on typer.id = værdier.typefk

open vaerdier
fetch next from vaerdier into @brugerid, @vaerdi, @beskrivelse

while @@fetch_status = 0
begin
    select @idExists = id from #t1 where id = @brugerid

    if (@idExists is null)
        insert into #t1 (id, beskrivelse) values(@brugerid, @beskrivelse + ': '+@vaerdi)
    else
        update #t1 set beskrivelse = (select beskrivelse from #t1 where id = @brugerid)+', '+@beskrivelse + ': '+@vaerdi where ID = @brugerid
   
    fetch next from vaerdier into @brugerid, @vaerdi, @beskrivelse
    set @idExists = null
end

Close vaerdier
Deallocate vaerdier


set nocount off

select navn, beskrivelse from #t1 inner join bruger on bruger.id = #t1.id


drop table #t1
Avatar billede janus_007 Nybegynder
30. september 2003 - 16:45 #4
Hvis du skal have resultat på en række som du jo gerne vil og det samtidig kan komme fra flere rækker/ kolonner skal du bruge en cursor!! 60 point for en cursor er for lidt hehe...

btw. så er medions svar nu også et join bare på ansii måden! Der mangler dog blot "and Værdier.typeFK = Type.id"

Jeg vil komme med et lille navngivningshint, take it or not :O) - Men det er bedre at kalde sine PK's for det de rent faktisk er istedet for kun id. evt. for Type kunne det være TypeID og så sin FK også for TypeID (evt. TypeIDfk, hvis man ikke lige gad at dokumentere relationen :O))

Hygge
Avatar billede dergruneskov Nybegynder
01. oktober 2003 - 16:11 #5
Hej bjornicle
Det er fjong; det var en model der kunne anvendes selvom den ikke er pæn :-) Jeg bruger dog FAST_FORWARD til cursor
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