Для построения фильтров по всем родителям возникла задача по нахождению всех предков в дереве на уровне SQL. Дерево представлено в виде таблицы:
Сама по себе задача стандартная и легко решается, например, с помощью CTE, но нужно было соблюсти последовательность всех родителей, т.е. родитель верхнего уровня должен был всегда идти раньше, чем родитель нижнего уровня. Достигается это с помощью небольшого трюка в стандартном коде:
Id | PId | Name |
Сама по себе задача стандартная и легко решается, например, с помощью CTE, но нужно было соблюсти последовательность всех родителей, т.е. родитель верхнего уровня должен был всегда идти раньше, чем родитель нижнего уровня. Достигается это с помощью небольшого трюка в стандартном коде:
;WITH up as ( SELECT Id, PId, 1 as level FROM tblSomeTable h WHERE Id = @Id UNION ALL SELECT h.Id, h.Pid, up.level + 1 as level FROM tblSomeTable h INNER JOIN up ON h.Id = up.PId ) SELECT Id FROM up ORDER BY level DESC
Комментариев нет:
Отправить комментарий