Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рекурсивно удалить детей.  [new]
forza
Member

Откуда:
Сообщений: 18
Может кто писал скрипт для удаления детей ? Есть главная таблица, на нее подвязаны другие, на них соответственно еще - заранее неизвестное кол-во. Нужно удалить всех детей для записи из главной таблиц. Спасибо.
18 мар 05, 15:21    [1398136]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Связи + ON DELETE CASCADE
18 мар 05, 15:28    [1398165]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а ещё поиск, там много было идей
18 мар 05, 15:30    [1398174]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
forza
Member

Откуда:
Сообщений: 18
to: Гавриленко Сергей Алексеевич

каскадное удаление не подходит. Весь смысл в том что-бы найти этих детей перед удалением.
18 мар 05, 15:37    [1398203]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
forza
to: Гавриленко Сергей Алексеевич

каскадное удаление не подходит. Весь смысл в том что-бы найти этих детей перед удалением.

Тогда триггера. Без связей.
18 мар 05, 15:38    [1398207]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
забиваем в темповую таблицу ключи всех узлов а потом грохаем
@id начальный узел
insert into #temp(id)values(@id) 
while @@rowcount > 0
  insert into #temp
  select t2.id #temp t1 
  join MyTable t2 where t2.ParentID = t1.id
  and not exists(select 1 from #temp where id = t2.id)
delete t2
from #temp t1
join MyTable t2 on (t2.id = t1.id)
18 мар 05, 16:04    [1398349]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
пардон - from пропустил
insert into #temp(id)values(@id) 
while @@rowcount > 0
  insert into #temp
  select t2.id   
  from #temp t1 
  join MyTable t2 where t2.ParentID = t1.id
  and not exists(select 1 from #temp where id = t2.id)
delete t2
from #temp t1
join MyTable t2 on (t2.id = t1.id)


18 мар 05, 16:06    [1398356]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивно удалить детей.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
Весь смысл в том что-бы найти этих детей перед удалением.

Каков смысл нахождения? В любом случае, триггер найдет, но уже после удаления.
18 мар 05, 16:06    [1398357]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить