sql >> Databasteknik >  >> RDS >> Sqlserver

Lista alla överordnade till ett objekt i en hierarkitabell som avgränsad sträng SQL

Det här verkar göra susen. Nyckeln är att inse att vi kan bygga upp vägen bakåt och sluta när vi inte längre har en förälder att hitta:

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

(Jag har lämnat i ytterligare kolumner för att hjälpa till att visa det slutliga tillståndet. Att fråga CTE utan filtrering kan också vara lärorikt)

Jag vill också varna för att jag vanligtvis inte skulle arbeta med avgränsade strängar om det alls är möjligt - det är inte en bra representation när SQL Server har typer designade för att arbeta med flera värden.



  1. Underhåll av SQL Server-systemdatabaser

  2. Konvertera 'tid' till 'datetimeoffset' i SQL Server (T-SQL-exempel)

  3. Grafik av Oracle 11g Database

  4. Hur får man en radrepresentation av en genererad tabell?