Avatar billede mini-me Nybegynder
20. maj 2009 - 09:09 Der er 7 kommentarer

Rekursiv SQL kald

Hej,

Jeg søger noget kode som kan hjælpe mig med at lave et rekursiv-kald i SQL. Jeg har følgende tabel.:

internetgroup

GUID | InternetGroup | GroupName | ParentGroup
1 | Undertoj | Undertøj | Toj
2 | Toj | Tøj |
3 | Bukser | Bukser | Toj
4 | Bluser | Bluser | Toj
5 | Sokker | Sokker | Toj
6 | Sko | Sko |
7 | Nike | Nike | Sko
8 | Adidas | Adidas | sko
9 | Adidas Herrer | Adidas Herre sko | adidas
10| Adidas Herre 40 | Adidas herrre sko str. 40 | Adidas herre

Hvis jeg nu forespørger på eks. internetgroup = Adidas Herre 40

så skal jeg have returneret

Sko | Adidas | Adidas Herrer | Adidas Herre 40

Spørger jeg på Adidas skal jeg have

Sko | Adidas
Avatar billede Syska Mester
20. maj 2009 - 10:12 #1
Taget fra et svar jeg gav i et andet spm ... kræver MSSQL 2008.
http://www.eksperten.dk/spm/875477


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 Syska Mester
20. maj 2009 - 10:14 #2
ja, så ser jeg at du brugte SQL 2005 fra et andet spm.

Så dur overstående ik'.

// ouT
Avatar billede mini-me Nybegynder
20. maj 2009 - 10:27 #3
Desværre.
Avatar billede wagner Nybegynder
20. maj 2009 - 22:38 #4
Rekursive kald virker også i ms sql 2005, så jeg synes du burde prøve esemplet.

Wagner
Avatar billede mini-me Nybegynder
24. maj 2009 - 19:09 #5
Hmm så skal jeg lige have lidt hjælp..

Har følgende nu, men hvordan kan ikke se hvordan sender jeg værdien: Adidas Herre 40, så den kan give mig et output?

WITH TMP AS
(
    SELECT
        grouping,
        ParentGroup,
        name
    FROM
        internetGroup
    WHERE
        ParentGroup IS NULL

    UNION ALL
 
    SELECT
        P.Grouping,
        P.ParentGroup,
        P.Name
    FROM
        internetgroup P
    INNER JOIN
        TMP ON TMP.Grouping = P.Parentgroup
)
SELECT
    *
FROM
    TMP
Avatar billede mini-me Nybegynder
25. juni 2009 - 07:54 #6
ingen yderligere?
Avatar billede Syska Mester
25. juni 2009 - 09:59 #7
Start modsat ... select child og lad de recursive kald gå den modsatte vej ... altså mod parent/ancestors

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