获取父 SQL 服务器变量 hierarchyid

Get the parent SQL Server variable hierarchyid

如何通过id(EmployeeID)使用sql中hierarchyid类型变量的变量获取table中的父节点? 这是我的 table

CREATE TABLE Employee
(
   Node hierarchyid PRIMARY KEY CLUSTERED,
   EmployeeID int UNIQUE NOT NULL,
   EmpName varchar(20) NOT NULL,
   Title varchar(20) NULL
) ;
GO

以下内容将帮助您理解层次结构并获得 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

这将使您成为@h

中指定 ID 的直接管理者
declare @h hierarchyid;

select *
from dbo.Employee
where Node = @h.GetAncestor(1);

虽然这会让你所有的经理都上链:

select *
from dbo.Employee
where @h.IsDescendantOf(Node) = 1

对于最后一个节点,节点被认为是其自身的后代。如果您不想查询 return @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
               )

感谢您的回答!!!