Here is my first hit. I hope I understand your requirements.
declare @Employee table ( EmployeeId int not null , ManagerId int not null , FamilyId int null ) -- 1 6 -- / \ / \ -- 2 3 7 8 -- / \ -- 4 5 insert @Employee values (1, 0, null) insert @Employee values (2, 1, null) insert @Employee values (3, 1, null) insert @Employee values (4, 2, null) insert @Employee values (5, 2, null) insert @Employee values (6, 0, null) insert @Employee values (7, 6, null) insert @Employee values (8, 6, null) -- the data before the update select * from @Employee -- initial update to get immediate managers update Employee set FamilyId = Manager.EmployeeId from @Employee Employee inner join @Employee Manager on Manager.EmployeeId = Employee.ManagerId -- the data after the first update select * from @Employee -- do more updates until done while exists ( select * from @Employee where ( FamilyId is not null and FamilyId not in ( select EmployeeId from @Employee where ManagerId = 0 ) ) ) begin update Employee set FamilyId = Manager.ManagerId from @Employee Employee inner join @Employee Manager on Manager.EmployeeId = Employee.FamilyId where ( Employee.FamilyId is not null and Employee.FamilyId not in ( select EmployeeId from @Employee where ManagerId = 0 ) ) end -- the data after all updates select * from @Employee
I'm sure there are smarter ways
source share