LINUX.ORG.RU

sql tree & informix, прошу высказаться


0

0

 Неделю назад возникла необходимость реализовать sql дерево в informix, поставил informix, поискал в инете готовые решения. Нашёл вот это file://localhost/home/informix/sql/tree.shtml.html, но предлагаемые там методы показались слишком ресурсоёмкими, поэтому решил написать сам (прошу сильно не ругать, т.к. книгу по sql начал смотреть только вчера). Если нетрудно, ответьте на пару вопросов:
 1) будет ли это работать быстрее, чем предлагаемые решения или нет
 2) можно ли тут что-нибудь улучшить.
Вот, собственно, и само решение
 Создал таблицу tree, со столбцами name (имя), id (номер по порядку), parent(id отца).
 Потом создал процедуру:

 create procedure "dim".sam (
 idF integer -- id элемента для которого нужно найти всех детей
  )
define i integer; -- переменная для цикла while
 -- создаём временные таблицы
 CREATE TEMP TABLE tmp001 (
      id      INTEGER,
      parent  integer
      )
      WITH NO LOG;
  CREATE TEMP TABLE tmp002 (
      id      INTEGER,
      parent  integer
      )
      WITH NO LOG;
  CREATE TEMP TABLE tmp003 (
      id      INTEGER,
      parent  integer
      )
      WITH NO LOG;
 -- создали временные таблицы
 
 -- очищаем таблицу, в которую будут
 --  записываться все найденные дети
 delete from tr;
 
 insert into tmp001  -- находим детей у элемента с idF 
 select id, parent   -- и помещаем во временную таблицу
 from tree
 where parent = idF;
 
 execute procedure usl() into i; -- проверяем сколько во временной таблице
                                 -- строк и присваиваем это значение i
 while i<>0			-- начало поиска всех детей
   insert into tmp002		-- помещаем всё из временной таблицы tmp001 в таблицу tpm002
     select * from tmp001;
     
   delete from tmp001;		-- очищаем временную таблицу tmp001
   
   insert into tmp001		-- находим для каждого ребёнка элемента с idF 
   select tr.id,tr.parent       -- находим детей, потом будем искать детей для этих дете
     from tree tr,tmp002 t      -- и т.д.
     where tr.parent = t.id;    -- помещаем найденные значения в таблицу tmp001
     
   insert into tmp003		-- записываем очередную партию детей
     select * from tmp002;
     
   delete from tmp002;		-- очищаем временную таблицу
   execute procedure usl() into i;
 end while; -- конец поиска детей
 
 drop table tmp001;
 drop table tmp002;
 insert into tr    -- помещаем всех найденных детей в таблицу tr
   select * from tmp003;
 drop table tmp003;
end procedure;
anonymous

Забыл сказать, можно обойтись и без таблицы tmp003, но думаю это практически не повлияет на производительность

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.