Avatar billede evilfish Nybegynder
18. maj 2009 - 20:15 Der er 8 kommentarer og
2 løsninger

Select statement der referer til sin egen tabel.

Hej eksperter

Jeg har brug for at vide om jeg kan lave en form for lykke i SQL select statement.

Mit scenarie er at jeg har en gruppe tabel, som har en kolonne som referere til en gruppe Over gruppe eller parent group om man vil. Hvis gruppen ikke har nogen overgruppe er det representeret via NULL.

Kan man på en eller anden smart måde få information omkring hvilke overgruppe en gruppe har?

Dvs hvis vi har følgende grupper:
Gruppe1 > Gruppe2 > Gruppe3

Her er gruppe1 over gruppe, 2 er mellem gruppe og 3 er den sidste. Er der en smart måde hvor jeg får overgruppe information us på fx gruppe 2 og gruppe 3?

Eller skal jeg til at kalde informationerne via 2-3 individuelle kald.

Håber I forstår hvor jeg vil hen.
Avatar billede Syska Mester
18. maj 2009 - 21:43 #1
WITH TMP AS
(
    SELECT
        PageID,
        ParentID,
        Name,
        FriendlyName,
        CONVERT(varchar(1024), '/') AS Url
    FROM
        tblPages
    WHERE
        ParentID IS NULL

    UNION ALL
   
    SELECT
        P.PageID,
        P.ParentID,
        P.Name,
        P.FriendlyName,
        CONVERT(varchar(1024), TMP.Url + P.FriendlyName + '/') AS Url
    FROM
        tblPages P
    INNER JOIN
        TMP ON TMP.PageID = P.ParentID
)
SELECT
    *
FROM
    TMP

Jeg har ikke selv kørt overstående SQL ... men henter det ud som du vil have ... URL bliver så sat sammen ... håber du kan gennemskue det ellers må du sige til :-)

OBS: Det er til MSSQL 2008
// ouT
Avatar billede evilfish Nybegynder
18. maj 2009 - 22:06 #2
Jeg har siddet og læst lidt op på WITH, som jeg ALDRIG har hørt om før, og lyder som et ret handy værktøj til komplicerede selects.

Jeg har forsøgt at forstå din sql kode, men hvad jeg ikke helt har forstået er hvad forskellen på de to with statements er og hvad UNION ALL gør i denne situation.
Avatar billede evilfish Nybegynder
18. maj 2009 - 22:22 #3
En vigtig information jeg glemte. Jeg scripter til en MSSQL 2000.
Avatar billede Syska Mester
19. maj 2009 - 00:25 #4
Så er WITH ikke så anvendeligt :-(

Tekst mæssigt gør den følgende ...

1. Tager alle ParentID hvis value er NULL
2. Første gang er nummer 2 select tom.
3. Ved andet gennem løb er TMP ikke tom, da den nu indeholder alt fra første gennem løb ... dvs alle Parents.
4. nu er nummer 2 select ikke tom, og bliver nu joined på andre i samme table ...
5. Det kører så indtil der ikke er flere at joine på ... og TMP som nu er større bliver så selected af sidste select i overstående kode ...

( Jeg mener faktisk at det er sidste select som sætter det hele igang ... )

Jeg har ingen smarte trisk hvis du ikke bruger MSSQL 2008 ... så ville jeg nok tage det hele ned hvor de skal bruge det og sætte dine parent/child relations sammen der.

// ouT
Avatar billede evilfish Nybegynder
19. maj 2009 - 13:24 #5
Tak fordi du forsøgte at hjælpe. Jeg fandt en anden løsning, som virker kanon: http://sqllessons.com/categories.html
Avatar billede Syska Mester
19. maj 2009 - 14:56 #6
Post gerne løsningen ... måske andre kan have glæden af den senene :-)
Avatar billede evilfish Nybegynder
19. maj 2009 - 19:15 #7
Det er ikke så meget at vise mere end hvad linket viser. Jeg har bare erstattet værdierne, og tilføjet en WHERE så jeg kun får information ud for en gruppe.
Avatar billede Syska Mester
19. maj 2009 - 22:03 #8
ahhh :-)

Men ... med 2008 er det nemt når du engang skifter DB version.

// ouT
Avatar billede evilfish Nybegynder
20. maj 2009 - 09:24 #9
Lyder det som om :) - Lukker tråd - Vil du have halvdelen af pointsne så smid et svar, for selv om du ikke kom med et svar jeg kunne bruge, så lærte jeg da lidt alligevel.
Avatar billede Syska Mester
20. maj 2009 - 10:14 #10
jo ... lyder som en fair deal.

// ouT
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