Неделю назад возникла необходимость реализовать 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)