2

如何使用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
4

3 回答 3

2

这将使您成为@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>
于 2015-08-26T22:18:01.230 回答
1

我找到了一个简单的方法来解决我的问题:

SELECT EmployeeID 
FROM Employee
WHERE [Node] IN (
               SELECT [Node].GetAncestor(1).ToString()
               FROM Employee
               WHERE EmployeeID=4
               )

感谢您的回答!!!

于 2015-08-27T12:49:32.210 回答
0

这将帮助您理解层次结构和获取 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
于 2015-08-26T20:40:05.787 回答