Это возможно и эффективно сделать с помощью одного запроса, если вы добавите некоторые метаданные иерархии в свою схему.
Добавьте два целочисленных столбца (start
и end
) в таблицу категорий. Затем выполните обход в глубину вашего дерева, увеличивая счетчик на каждом шаге и присваивая значение счетчика start
при входе в узел и end
при выходе (т.е. когда все его дочерние элементы были обработаны).
Так, для вашего примера, со значениями, показанными как (start,end)
:
Animals (1,18)
Birds (2,7)
Parrots (3,6 )
Penguin (4,5)
Mammals (8,13)
Cats (9,12)
Dogs (10,11)
Reptiles (14,17)
Snakes (15,16)
Plants (19,24)
Trees (20,23)
Flowers (21,22)
Теперь, чтобы выбрать получить животных и их детей, вы можете просто выполнить что-то вроде этого запроса:
SELECT * FROM Category where start >=1 and start < 18
Вы, очевидно, взвесили стоимость перестройки метаданных, когда иерархия изменилась, по сравнению с эффективностью запросов на чтение. Для относительно статических иерархий этот метод работает довольно хорошо.