Создание запросов к иерархической таблице с помощью иерархических методов
После того как таблица 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 перечисляется, поскольку она является потомком на нулевом уровне. Wanida является потомком на первом уровне.
Также эту информацию можно запросить с помощью метода 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
В этот раз в результате также будет возвращена Mary, являющаяся подчиненной David, и находящаяся на два уровня ниже.
Использование методов 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
Следующая задача проведет реорганизацию иерархии.
Следующая задача занятия
Изменение порядка данных в иерархической таблице с помощью иерархических методов