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

由于 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
    

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

课程中的下一个任务

使用分层方法对层次结构表中的数据重新排序