Есть несколько способов сделать это, но это самый простой.Я вставляю в переменную временную таблицу @result, потому что вы хотите идти вверх и вниз от цели.
Сначала настройте свои данные:
declare @t table(ID int, AGENT_CODE varchar(10), MANAGER_CODE varchar(10), DESIGNATION varchar(20), NAME varchar(20))
insert @t values
(1, '0001', '0000', 'GEN MANAGER', 'STEVE')
,(2, '0002', '0001', 'REGIONAL MANAGER', 'ALBERT')
,(3, '0003', '0001', 'REGIONAL MANAGER', 'JOHN')
,(4, '0004', '0002', 'UNIVERSAL TELLER', 'HENRY')
,(5, '0005', '0003', 'UNIVERSAL TELLER', 'MEVRICK')
,(6, '0006', '0002', 'TELLER', 'BRINGER')
,(7, '0007', '0003', 'TELLER', 'ANTONIO')
select * from @t
Создайте таблицу для хранения результатов и цели, которую мы ищем
declare @result table(ID int, AGENT_CODE varchar(10), MANAGER_CODE varchar(10), DESIGNATION varchar(20), NAME varchar(20))
declare @target int; set @target=6
Пройдите по дереву
;with cte as
(
select * from @t where id=@target
union all
select t.* from @t t
join cte on cte.manager_code=t.agent_code
)
insert @result
select * from cte
Пройдите по дереву в обратном направлении
;with cte as
(
select * from @t where id=@target
union all
select t.* from @t t
join cte on cte.agent_code=t.manager_code
)
insert @result
select * from cte
Выведите ваш результат:
select distinct * from @result
ID AGENT_CODE MANAGER_CODE DESIGNATION NAME
1 0001 0000 GEN MANAGER STEVE
2 0002 0001 REGIONAL MANAGER ALBERT
6 0006 0002 TELLER BRINGER