Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изброяване на всички родители на елементи в йерархична таблица като разделен низ SQL

Това изглежда върши работа. Ключът е да осъзнаем, че можем да изградим пътя назад и да спрем, когато вече нямаме родител, който да намерим:

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

Резултат:

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

(Оставих допълнителни колони, за да ви помогне да покажа крайното състояние. Запитването на CTE без филтриране също може да бъде поучително)

Също така бих предупредил, че обикновено не бих работил с разделени низове, ако изобщо е възможно - не е добро представяне, когато SQL Server има проектирани типове за работа с множество стойности.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да видя SQL заявка в SQL Profiler?

  2. Импортиране на excel файлове с променливи заглавки

  3. Как да използвате логиката IF...THEN в SQL Server

  4. SQL групиране по месец и година

  5. Свързване към отдалечен SQL Server 2008 от Windows Azure