如何使用sql中的hierarchyid类型变量的变量通过id(EmployeeID)获取表中的父节点?这是我的桌子
CREATE TABLE Employee
(
Node hierarchyid PRIMARY KEY CLUSTERED,
EmployeeID int UNIQUE NOT NULL,
EmpName varchar(20) NOT NULL,
Title varchar(20) NULL
) ;
GO
如何使用sql中的hierarchyid类型变量的变量通过id(EmployeeID)获取表中的父节点?这是我的桌子
CREATE TABLE Employee
(
Node hierarchyid PRIMARY KEY CLUSTERED,
EmployeeID int UNIQUE NOT NULL,
EmpName varchar(20) NOT NULL,
Title varchar(20) NULL
) ;
GO
这将使您成为@h 中指定的 id 的直属经理
declare @h hierarchyid;
select *
from dbo.Employee
where Node = @h.GetAncestor(1);
虽然这会让你所有的经理都上链:
select *
from dbo.Employee
where @h.IsDescendantOf(Node) = 1
对于最后一个,一个节点被认为是它自己的后代。如果您不希望查询返回 @h 中指定的员工,请将谓词添加and Node <> @h
到 where 子句。
编辑:
重新阅读您的问题,您似乎想传入一个 EmployeeID 并获取经理。就是这样:
select m.*
from dbo.Employee as e
join dbo.Employee as m
on e.Node.GetAncestor(1) = m.Node
where e.EmployeeID = <yourIDHere>
我找到了一个简单的方法来解决我的问题:
SELECT EmployeeID
FROM Employee
WHERE [Node] IN (
SELECT [Node].GetAncestor(1).ToString()
FROM Employee
WHERE EmployeeID=4
)
感谢您的回答!!!
这将帮助您理解层次结构和获取 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