sql >> Databáze >  >> RDS >> Sqlserver

Výpis všech rodičů položek v tabulce hierarchie jako oddělený řetězec SQL

Zdá se, že to funguje. Klíčem je uvědomit si, že si cestu můžeme vybudovat zpětným způsobem a zastavit se, když už nemáme rodiče, které bychom našli:

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

Výsledek:

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

(Ponechal jsem v dalších sloupcích, aby pomohly zobrazit konečný stav. Dotazování na CTE bez filtrování může být také poučné)

Také bych varoval, že bych obvykle nepracoval s oddělovacími řetězci, pokud je to možné – není to skvělé znázornění, když má SQL Server typy navržené pro práci s více hodnotami.



  1. Enum datový typ versus tabulka dat v MySQL?

  2. Jak obnovit zálohu SQL Server 2014 v SQL Server 2008

  3. Řecký text se nezobrazuje správně

  4. Mysql dotaz spuštěn dvakrát je třeba rychlejší podruhé i s SQL_NO_CACHE