Sql server 获取父SQL Server变量hierarchyid

Sql server 获取父SQL Server变量hierarchyid,sql-server,parent,hierarchyid,Sql Server,Parent,Hierarchyid,如何使用sql by id(EmployeeID)中hierarchyid类型变量的变量获取表中的父节点? 这是我的桌子 CREATE TABLE Employee ( Node hierarchyid PRIMARY KEY CLUSTERED, EmployeeID int UNIQUE NOT NULL, EmpName varchar(20) NOT NULL, Title varchar(20) NULL ) ; GO 下面是有助于您理解层次结构和获取父对象i

如何使用sql by id(EmployeeID)中hierarchyid类型变量的变量获取表中的父节点? 这是我的桌子

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

下面是有助于您理解层次结构和获取父对象id的内容(在下面的示例中,我称之为ManagerID)


这将为您获取@h中指定id的直接管理者

declare @h hierarchyid;

select *
from dbo.Employee
where Node = @h.GetAncestor(1);
虽然这会让你得到所有的管理者:

select *
from dbo.Employee
where @h.IsDescendantOf(Node) = 1
对于最后一个节点,节点被视为自身的后代。如果不希望查询返回@h中指定的employee,请将谓词
和节点@h
添加到where子句中

编辑:

重读你的问题,你可能想通过一个员工ID,找到经理。这是:

select m.*
from dbo.Employee as e
join dbo.Employee as m
   on e.Node.GetAncestor(1) = m.Node
where e.EmployeeID = <yourIDHere>
选择m*
来自dbo.Employee作为e
加入dbo.Employee作为m
在e.Node.getAn祖(1)=m.Node上
其中e.EmployeeID=

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

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

谢谢你的回答

OP有一个hierarchyid列,因此层次结构已经在行中具体化;不需要递归CTE来确定它。而且,他们甚至没有机会这样做,因为他们没有存储经理的ID!您不需要在子查询中调用ToString()(也就是说,SQL Server很乐意比较层次结构ID的二进制版本)。
SELECT EmployeeID 
FROM Employee
WHERE [Node] IN (
               SELECT [Node].GetAncestor(1).ToString()
               FROM Employee
               WHERE EmployeeID=4
               )