Consultando uma tabela hierárquica usando métodos de hierarquia
Agora que a tabela HumanResources.EmployeeOrg está completamente populada, essa tarefa mostrará como consultar a hierarquia usando alguns métodos hierárquicos.
Para localizar nós subordinados
Sariya tem um funcionário subordinado. Para identificar os subordinados de Sariya, execute a seguinte consulta, que usa o método IsDescendant:
DECLARE @CurrentEmployee hierarchyid SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = 46 ; SELECT * FROM HumanResources.EmployeeOrg WHERE OrgNode.IsDescendantOf(@CurrentEmployee) = 1 ;
O resultado lista Sariya e Wanida. Sariya é listada porque é a descendente no nível 0. Wanida é a descendente no nível 1.
Você também pode consultar essas informações usando o método GetAncestor. O GetAncestor leva um argumento para o nível ao qual você está tentando retornar. Como Wanida está um nível abaixo de Sariya, use GetAncestor(1) conforme demonstrado no seguinte código:
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
Desta vez o resultado lista apenas Wanida.
Agora altere o @CurrentEmployee para David (EmployeeID 6) e o nível para 2. Execute o seguinte para retornar também 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
Desta vez, você também recebe Mary que também é subordinada a David, dois níveis abaixo.
Para usar GetRoot e GetLevel
À medida que a hierarquia fica maior é mais difícil determinar onde os membros estão na hierarquia. Use o método GetLevel para localizar quantos níveis abaixo cada linha está na hierarquia. Execute o seguinte código para exibir os níveis de todas as linhas:
SELECT OrgNode.ToString() AS Text_OrgNode, OrgNode.GetLevel() AS EmpLevel, * FROM HumanResources.EmployeeOrg ; GO
Use o método GetRoot para localizar o nó raiz na hierarquia. O seguinte código retorna uma única linha que é a raiz:
SELECT OrgNode.ToString() AS Text_OrgNode, * FROM HumanResources.EmployeeOrg WHERE OrgNode = hierarchyid::GetRoot() ; GO
A próxima tarefa reorganizará a hierarquia.