使用层次结构方法查询层次结构表

由于 HumanResources.EmployeeOrg 表已完全填充,此任务将说明如何使用某些分层方法来查询层次结构。

查找从属节点

  1. 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 级后代。

  2. 此外,可以通过使用 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。

  3. 现在,将 @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

  1. 随着层次结构不断扩大,更加难于确定成员在层次结构中的位置。使用 GetLevel 方法可查明每一行下方有多少个级别处于层次结构中。执行下面的代码以查看所有行的下属级别:

    SELECT OrgNode.ToString() AS Text_OrgNode, 
    OrgNode.GetLevel() AS EmpLevel, *
    FROM HumanResources.EmployeeOrg ;
    GO
    
  2. 使用 GetRoot 方法查找层次结构中的根节点。下面的代码返回一个作为根的行:

    SELECT OrgNode.ToString() AS Text_OrgNode, *
    FROM HumanResources.EmployeeOrg
    WHERE OrgNode = hierarchyid::GetRoot() ;
    GO
    

下一个任务将重新组织层次结构。