Неделю назад возникла необходимость реализовать 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;
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум MySQL дефолтная сортировка (2010)
- Форум составить «простой» SQL запрос (2006)
- Форум Наконец-то! Я осилил рекурсивное дерево на SQL! (2016)
- Форум Запрос статистики (2014)
- Форум [MySQL] кодировка передаваемых в процедуру параметров. (2011)
- Форум sqlite избежать автоинкремента primary key (2017)
- Форум Проблема с упорядочиванием записей в PostgreSQL (2017)
- Форум Удаление из большой таблицы без потери constraints (2016)
- Форум DDL-запрос и select в одном Statement (2018)
- Форум select from jsonb (2018)