使用层次结构方法查询层次结构表
由于 HumanResources.EmployeeOrg 表已完全填充,此任务将说明如何使用某些分层方法来查询层次结构。
查找从属节点
Sariya 有一名下属雇员。若要查询 Sariya 的下属,请执行使用 IsDescendantOf 方法的以下查询:
DECLARE @CurrentEmployee hierarchyid SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = 46 ; SELECT * FROM HumanResources.EmployeeOrg WHERE OrgNode.IsDescendantOf(@CurrentEmployee) = 1 ;
结果同时列出 Sariya 和 Wanida。Sariya 的列出原因是她是 0 级后代。Wanida 是 1 级后代。
此外,可以通过使用 GetAncestor 方法查询此信息。GetAncestor 对尝试返回的级别采用了一个参数。由于 Wanida 位于 Sariya 下面一级,因此使用 GetAncestor(1),如以下代码所示:
DECLARE @CurrentEmployee hierarchyid SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = 46 ; SELECT OrgNode.ToString() AS Text_OrgNode, * FROM HumanResources.EmployeeOrg WHERE OrgNode.GetAncestor(1) = @CurrentEmployee
这次,结果仅列出 Wanida。
现在,将 @CurrentEmployee 更改为 David (EmployeeID 6),并将级别更改为 2。执行以下过程也会返回 Wanida:
DECLARE @CurrentEmployee hierarchyid SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = 6 ; SELECT OrgNode.ToString() AS Text_OrgNode, * FROM HumanResources.EmployeeOrg WHERE OrgNode.GetAncestor(2) = @CurrentEmployee
这次,还收到向 David 报告的位于两个级别之下的 Mary。
使用 GetRoot 和 GetLevel
随着层次结构不断扩大,更加难于确定成员在层次结构中的位置。使用 GetLevel 方法可查明每一行下方有多少个级别处于层次结构中。执行下面的代码以查看所有行的下属级别:
SELECT OrgNode.ToString() AS Text_OrgNode, OrgNode.GetLevel() AS EmpLevel, * FROM HumanResources.EmployeeOrg ; GO
使用 GetRoot 方法查找层次结构中的根节点。下面的代码返回一个作为根的行:
SELECT OrgNode.ToString() AS Text_OrgNode, * FROM HumanResources.EmployeeOrg WHERE OrgNode = hierarchyid::GetRoot() ; GO
下一个任务将重新组织层次结构。