Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Удаление иерархии
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Удаление иерархии

Страниц (1): [1]
 

1. SAD - 17 Октября, 2011 - 17:50:07 - перейти к сообщению
Есть например запись в таблице, на эту запись ссылаются другие записи из этой же таблицы и т.д. для каждой ссылающейся записи.
Так вот в чем вопрос. Как удалеть все записи, начиная с самой глубоко вложенной?

Это дело хочется организовать в виде процедуры в firebird

Каскадное удаление не было предусмотрено. Отпадает
2. Champion - 17 Октября, 2011 - 18:58:09 - перейти к сообщению
SAD пишет:
начиная с самой глубоко вложенной?
Т.е. двигаться наверх к корню? Тогда что делать с ветками дерева, которые растут из удаляющихся вершин? Или все-таки начинать надо от заданной и удалять все ее поддеревья?
(Добавление)
Если всё же удалять надо от вершины вниз, то можно так:
CODE (SQL):
скопировать код в буфер обмена
  1. WITH del_ids AS (
  2.         SELECT id
  3.         FROM tbl WHERE id = :del_id
  4.         UNION ALL
  5.         SELECT t.id
  6.         FROM tbl t
  7.         JOIN del_ids d ON t.parent_id = d.id
  8. )
  9. DELETE FROM tbl WHERE id IN (SELECT id FROM del_ids)

(Добавление)
Соответсвенно :del_id - с этой айдишки начинаем удалять
(Добавление)
CTE появились в FB с версии 2.1. На 2.0 так не получится. Будем надеяться, что у вас там 2.1 стоит или 2.5 даже)
3. SAD - 17 Октября, 2011 - 19:31:42 - перейти к сообщению
Champion, выглядит красиво. спасибо большое. завтра попробую. неважно откуда начинать удалять, главное, чтобы удалило все что связано. стоит 2.1 к счастью =)
4. SAD - 18 Октября, 2011 - 13:22:11 - перейти к сообщению
я немного тогда неправильно поставил задачу, но я сам разобрался. все же спасибо)

 

Powered by ExBB FM 1.0 RC1