21.03.2014

SQL: Получение всех предков элемента в дереве, отсортированных по порядку

Для построения фильтров по всем родителям возникла задача по нахождению всех предков в дереве на уровне SQL. Дерево представлено в виде таблицы:
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

Комментариев нет:

Отправить комментарий