18. maj 2009 - 20:15Der 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.
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 :-)
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.
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.
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.
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.
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.