sql >> Database >  >> RDS >> Sqlserver

Alle bovenliggende items van een item in een hiërarchietabel weergeven als SQL met scheidingstekens

Dit lijkt de truc te doen. De sleutel is om te beseffen dat we het pad achteruit kunnen opbouwen en kunnen stoppen wanneer we geen ouder meer hebben om te lokaliseren:

DECLARE @t table (ID int not null, Name varchar(19) not null, ParentID int null)
insert into @t(ID,Name,ParentID) values
(1 ,'Alex',null),
(2 ,'John',null),
(3 ,'Don',1),
(4 ,'Philip',2),
(5 ,'Shiva',2),
(6 ,'San',3),
(7 ,'Antony',6),
(8 ,'Mathew',2),
(9 ,'Cyril',8),
(10,'Johan',9)

declare @search table (ID int not null)
insert into @search (ID) values (7),(10)

;With Paths as (
    select s.ID as RootID,t.ID,t.ParentID,t.Name, CONVERT(varchar(max),t.Name) as Path
    from
        @search s
            inner join
        @t t
            on
                s.ID = t.ID
    union all
    select p.RootID,t.ID,t.ParentID,p.Name, t.Name + '->' + p.Path
    from Paths p
            inner join
        @t t
            on
                p.ParentID = t.ID
)
select * from Paths where ParentID is null

Resultaat:

RootID      ID          ParentID    Name                Path
----------- ----------- ----------- ------------------- ----------------------------
10          2           NULL        Johan               John->Mathew->Cyril->Johan
7           1           NULL        Antony              Alex->Don->San->Antony

(Ik heb in extra kolommen gelaten om de uiteindelijke status weer te geven. De CTE opvragen zonder te filteren kan ook leerzaam zijn)

Ik zou ook waarschuwen dat ik normaal gesproken niet met gescheiden tekenreeksen zou werken als dat al mogelijk is - het is geen goede weergave wanneer SQL Server typen ontworpen heeft voor het werken met meerdere waarden.



  1. Ontvang bijgewerkte waarde in MySQL in plaats van betrokken rijen

  2. MySQL-query:invoegen als invoer duplicaat is, anders de bestaande rijwaarden bijwerken

  3. Een-op-een relatie waarbij meerdere tabellen betrokken zijn

  4. MYSQL invoegen waar niet bestaat met PDO