sql >> Database teknologi >  >> RDS >> Sqlserver

Visning af alle forældre til et element i en hierarkitabel som afgrænset streng SQL

Dette ser ud til at gøre tricket. Nøglen er at indse, at vi kan bygge vejen op på baglæns måde og stoppe, når vi ikke længere har en forælder at finde:

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

Resultat:

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

(Jeg har forladt i yderligere kolonner for at hjælpe med at vise den endelige tilstand. Forespørgsel til CTE uden filtrering kan også være lærerigt)

Jeg vil også advare om, at jeg normalt ikke ville arbejde med afgrænsede strenge, hvis det overhovedet er muligt - det er ikke en god repræsentation, når SQL Server har typer designet for at arbejde med flere værdier.



  1. Hvordan forbinder man NetBeans til MySQL-databasen?

  2. Django:NotImplementedError:annotate() + distinct(fields) er ikke implementeret

  3. postgresql:bestilt resultat

  4. Indsættelse af et multidimensionelt php-array i en mysql-database