Вот что поможет вам в понимании иерархии и получение parent_id (в примере ниже, я назвал его ManagerID).
/*
Here is the problem definition:
1. Employees table contains the following columns a) EmployeeId, b) EmployeeName c) ManagerId
2. If an EmployeeId is passed, the query should list down the entire organization hierarchy i.e who is the manager of the EmployeeId passed and who is managers manager and so on till full hierarchy is listed.
Here are the two scenarios -
Scenario 1: If we pass Javed's EmployeeId to the query, then it should display the organization hierarchy starting from Javed.
Scenario 2: If we pass Nussenbaum's EmployeeId to the query, then it should display the organization hierarchy starting from Nussenbaum.
*/
--Here is the test data
IF OBJECT_ID ('tempdb..#Employees') IS NOT NULL
DROP TABLE #Employees
Create table #Employees
(
EmployeeID int primary key identity,
EmployeeName nvarchar(50),
ManagerID int foreign key references #Employees(EmployeeID)
)
GO
Insert into #Employees values ('Sonal', NULL)
Insert into #Employees values ('Angus', NULL)
Insert into #Employees values ('Nik', NULL)
Insert into #Employees values ('Abu', NULL)
Insert into #Employees values ('Nussenbaum', NULL)
Insert into #Employees values ('Anirudh', NULL)
Insert into #Employees values ('Javed', NULL)
Insert into #Employees values ('Ron', NULL)
Insert into #Employees values ('Matt', NULL)
Insert into #Employees values ('Nikhil', NULL)
GO
Update #Employees Set ManagerID = 8 Where EmployeeName IN ('Angus', 'Nik', 'Nussenbaum')
Update #Employees Set ManagerID = 2 Where EmployeeName IN ('Matt', 'Anirudh')
Update #Employees Set ManagerID = 3 Where EmployeeName IN ('Abu')
Update #Employees Set ManagerID = 5 Where EmployeeName IN ('Sonal', 'Nikhil')
Update #Employees Set ManagerID = 4 Where EmployeeName IN ('Javed')
GO
--Here is the SQL that does the job
Declare @ID int ;
Set @ID = 7;
WITH EmployeeCTE AS
(
Select EmployeeId, EmployeeName, ManagerID
From #Employees
Where EmployeeId = @ID
UNION ALL
Select #Employees.EmployeeId , #Employees.EmployeeName, #Employees.ManagerID
From #Employees
JOIN EmployeeCTE
ON #Employees.EmployeeId = EmployeeCTE.ManagerID
)
Select E1.EmployeeName, ISNULL(E2.EmployeeName, 'No Boss') as ManagerName
From EmployeeCTE E1
LEFT Join EmployeeCTE E2
ON E1.ManagerID = E2.EmployeeId
Вам не нужен вызов ToString() в подзапросе (т. Е. SQL Server с удовольствием сравнивает двоичные версии Иерархических идентификаторов). –