Проблема произвольной вложенности
При произвольной глубине вложенности и неизвестном количестве поколений потомства начинаются трудности. В SQL нет условных операторов; подзапрос либо находит записи, либо нет. Джо Селко (Joe Celko) посвятил две главы своей книги «SQL for Smarties» (Morgan Kaufman Publishers, 1995) деревьям и графам, а точнее — данным, представляемым в виде визуальных графов, в том числе и в виде иерархических деревьев. Пользуясь нетривиальными приемами, он показывает, как правильно ассоциировать один объект (или узел) с другим.
Если вас устроит простое, но менее эффективное (и заведомо менее элегантное) решение, воспользуйтесь двумя временными таблицами: первая (Final) применяется для накопления результатов нескольких запросов, а вторая (Working) — для хранения результатов последнего запроса. Возможно, в зависимости от используемого SQL-сервера вам придется работать с двумя таблицами Working и переключаться между ними. Алгоритм выглядит так:
- Выполнить запрос для поиска детей исходного объекта.
- Скопировать идентификаторы найденных объектов в таблицу Working.
- Выполнить запрос для поиска детей объектов, идентификаторы которых хранятся в таблице Working.
- Если не будет найден ни один объект, прекратить работу.
- Добавить содержимое таблицы Working в таблицу Final.
- Очистить таблицу Working и занести в нее все идентификаторы объектов, найденных в результате запроса.
- Вернуться к шагу 3.
Каждый цикл находит объекты следующего поколения, а таблица Final будет содержать все найденные объекты в порядке следования поколений.