Учитывая следующий рекурсивный запрос:
WITH DepartmentHierarchy (DepartmentID, Name, IsInactive, IsSpecial, ParentId, HierarchyLevel) AS
(
-- Base case
SELECT
DepartmentId,
Name,
IsInactive,
IsSpecial,
ParentId,
1 as HierarchyLevel
FROM StoreDepartment
WHERE ParentId IS NULL
UNION ALL
-- Recursive step
SELECT
d.DepartmentId,
d.Name,
d.IsInactive,
d.IsSpecial,
d.ParentId,
dh.HierarchyLevel + 1 AS HierarchyLevel
FROM StoreDepartment d
INNER JOIN DepartmentHierarchy dh ON
d.ParentId = dh.DepartmentId
) SELECT * FROM DepartmentHierarchy
Я могу выбрать данные, которые выглядят так:
DepartmentId, Name, IsInactive, IsSpecial, ParentId, HeirarchyLevel
1, Store, 0, 0, NULL, 1
2, Main Department 1, 0, 1, 2
3, Main Department 2, 0, 1, 2
4, Sub For Main 1, 0, 2, 3
Также предположим, что существует таблица с DepartmentId и ItemId (например, DepartmentItemRelationship). Узлы листьев из иерархии отдела здесь соединены с элементами.
Я хочу, чтобы мой рекурсивный запрос возвращал только узлы (на любом уровне), у которых под ними есть хотя бы один листовой узел с соответствием в таблице отношений отдел / элемент. Эти узлы могут быть на 6 или 7 уровней ниже, поэтому я не уверен, как бы я изменил свой запрос, чтобы обязательно включить их.
Спасибо,
Kyle