계층 메서드를 사용하여 계층적 테이블 쿼리
이제 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
다음 태스크에서는 계층을 다시 구성합니다.