Рекурсивное удаление из одной таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Есть таблица составных деталей с "древесной" структурой, т.е. код/код предка/название, например:
Исправлено 1 раз(а). Последнее : ry, 26.08.09 17:02 |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Отчего ж нельзя - можно конечно. Именно рекурсивно и делается. Главное разделять внутреннее состояние процедуры для каждой итерации - например используя LOCAL переменные/массивы, или делая запросы в курсоры с уникальными именами, или цикл с сохранением "текущей обрабатываемой записи" в локальной переменной.
------------------ WBR, Igor |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
А можно пойти и "с другой стороны".
К сожалению не удаётся заставить фокс исполнять рекурсивно вызов процедуры из запроса в этой же процедуре Типа
------------------ WBR, Igor |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Без рекурсии тоже можно написать
|
Re: Рекурсивное удаление из одной таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Вариант Леонида несопоставимо быстрее: у меня выходили соотношения по затратам времени 4.688/0.328, 16.625/0.375, 20.656/0.438 и т.д. Во втором варианте Игоря на строке
Спасибо за идеи! |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Похожая тема рассматривалась тут:
forum.foxclub.ru |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну по сути твой цикл это и есть рекурсия - только без лишних вызовов, и с "накоплением" результата разузлования дерева
В таких таблицах обычно есть индексы и по id и по parent_id, и вместо запросов может оказаться эффективнее INDEXSEEK. А если нету триггеров ссылочной целостности (т.е. порядок удаления узлов можно не соблюдать), то можно просто удалить нужный элемент, и потом в цикле крутить удаление появившихся "сирот".
Insufficient stack space - это сколько ж уровней в дереве что штатного стека не хватило ------------------ WBR, Igor |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Игорь, я не знаю, как это на фоксе, но, например на DB2, такие конструкции, как
|
Re: Рекурсивное удаление из одной таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Это в случае приведенного мною примера для сравнения скорости алгоритмов. Там в тестовом курсоре код родителя формируются через RAND, так что уровней не намного меньше, чем записей Но ошибка вылетает даже при 50 записях в таблице (хотя при 20 ее нет) |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
А в оракле есть штатные средства работы с древовидными структурами - connect by в частности - ничего "своего" для разузлования изобретать не надо А удаление "подчинённых" реализуется вообще без кода - декларативно, "каскадным" констрейном ссылочной целостности
------------------ WBR, Igor |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
|
Re: Рекурсивное удаление из одной таблицы | |
---|---|
msa_tech Автор Сообщений: 103 Откуда: Сыктывкар Дата регистрации: 29.07.2009 |
Добавлю (не сочтите за рекламу ) и выделю - выбрать всю иерархию одним запросом, на любую нужную глубину, + контроль зацикливания (в 10-ке), и еще много чего... |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
В таком варианте работает очень медленно из-за использования функции STR(). Если же заменить выражение на числовое det_id*1000000+parent_id (разрядность подбирается заведомо больше, чем разрядность det_id), то работает даже быстрее, чем вариант Леонида. p.s. Оценивал только скорость, правильность удаления еще не проверял... |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
С ораклом не работал, но реклама замечательная |
Re: Рекурсивное удаление из одной таблицы | |
---|---|
Naomi Сообщений: 1796 Дата регистрации: 09.10.2003 |
SQL Server 2005+ hierarchical CTE - позволяют работать с древовидной структурой
|
Re: Рекурсивное удаление из одной таблицы | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Цитата:На самом деле можно не использовать функцию STR() или det_id*1000000+parent_id так как для однозначного определения того что надо удалять из TREE достаточно DET_ID,поэтому процедура удаления примет вид:
|
© 2000-2024 Fox Club  |