2015-08-26 2 views
0

Как получить родительский узел в таблице, используя переменную переменной иерархии типов в sql по id (EmployeeID)? это мой столПолучить родительскую переменную SQL Server hierarchyid

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

ответ

0

я найти простой способ решить мою проблему:

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

спасибо за ответ !!!

+0

Вам не нужен вызов ToString() в подзапросе (т. Е. SQL Server с удовольствием сравнивает двоичные версии Иерархических идентификаторов). –

-1

Вот что поможет вам в понимании иерархии и получение 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 
+0

ОП имеет столбец иерархии, поэтому иерархия уже реализована в строке; нет необходимости в рекурсивном CTE для его определения. Более того, нет даже возможности сделать это, так как они не хранят идентификатор менеджера! –

0

Это поможет вам немедленный менеджер идентификатор в @H

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.

EDIT:

Перечитывая свой вопрос, похоже, вы можете пройти в EmployeeID и получить менеджера. Вот что:

select m.* 
from dbo.Employee as e 
join dbo.Employee as m 
    on e.Node.GetAncestor(1) = m.Node 
where e.EmployeeID = <yourIDHere> 
Смежные вопросы