Зависит от того, как вы храните вашу иерархию. Если у вас есть только ParentID, то это может быть не самый эффективный подход, который вы выбрали. Для облегчения работы с поддеревьями у вас должен быть дополнительный столбец Parents
, в котором будут храниться все родительские идентификаторы, например:
/1/20/25/40
Таким образом, вы сможете получить все подузлы просто:
where Parents like @NodeParents + '%'
Второй подход
Вместо только ParentID вы также можете иметь значения left
и right
. Вставки, делающие это таким образом, работают медленнее, но операции выбора выполняются чрезвычайно быстро. Особенно при работе с узлами поддеревьев ... http://en.wikipedia.org/wiki/Tree_traversal
Третий подход
проверить рекурсивные CTE, если вы используете SQL 2005 +
Четвертый подход
Если вы используете SQL 2008, проверьте тип HierarchyID. Это дает достаточно возможностей для вашего случая.
http://msdn.microsoft.com/en-us/magazine/cc794278.aspx