Проблема произвольной вложенности


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

Если вас устроит простое, но менее эффективное (и заведомо менее элегантное) решение, воспользуйтесь двумя временными таблицами: первая (Final) применяется для накопления результатов нескольких запросов, а вторая (Working) — для хранения результатов последнего запроса. Возможно, в зависимости от используемого SQL-сервера вам придется работать с двумя таблицами Working и переключаться между ними. Алгоритм выглядит так:

  1. Выполнить запрос для поиска детей исходного объекта.
  2. Скопировать идентификаторы найденных объектов в таблицу Working.
  3. Выполнить запрос для поиска детей объектов, идентификаторы которых хранятся в таблице Working.
  4. Если не будет найден ни один объект, прекратить работу.
  5. Добавить содержимое таблицы Working в таблицу Final.
  6. Очистить таблицу Working и занести в нее все идентификаторы объектов, найденных в результате запроса.
  7. Вернуться к шагу 3.

Каждый цикл находит объекты следующего поколения, а таблица Final будет содержать все найденные объекты в порядке следования поколений.



Содержание раздела