![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дерево SQL - удаление дочерних веток [D5, IB6.x]
Wizard_Ex © (2003-02-09 17:02:00)Есть таблица
ID - integer, Parent_ID - integer , Name - varChar(15)
1 -1 Альфа
2 1 Бета
3 1 Гамма
4 1 Дельта
5 2 Каппа
6 2 Ламбда
7 5 О Микрон
8 7 Пи
9 2 Ро
Выглядит все это так:
Альфа
Бета
Каппа
О Микрон
Пи
Ламбда
Ро
Гамма
Дельта
Как удалить все дочерние ветви ветки с ID=2 и ее тоже, т.е ветку Бета с дочерними ветками.
Александр С. (2003-02-12 12:22:00) [1]Delete from <TableName> where Parent = Old.ID
Кило (2003-02-12 10:04:00) [2]А как написать в тригере (до удаления) чтобы удалялись дочери?
Александр С. (2003-02-12 07:55:00) [3]> можно ли запросом сделать выборку все веток кроме ветки Бета и ее дочерних веток
Просто запросом ИМХО нельзя.
Рекурсия в ХП из которой исключается ветка Бета.
Но при большомколичестве записей записей возможныпроблеммы.
Wizard_Ex (2003-02-12 07:43:00) [4]Вопрос по той же теме
можно ли запросом сделать выборку все веток кроме ветки Бета и ее дочерних веток
однако
насчет следующего согласен
> Александр С. © (11.02.03 10:46)
при вставке корня ID и Parent_ID должны быть равны иначе Foreign key не даст вставить запись
jocko (2003-02-11 14:03:00) [5]по поводу корней и вообще дерева, повторюсь (вообще этот вопрос недавно поднимался)
так вот, скачем от печки: осн. правило есть объект - есть таблица.
объектов 2:
1. непосредственно сущность которую описываем (например "единицы
измерения": id, название)
2. соотношения между ними (id, parent_id, соответствие)
(пример чисто для наглядности)
достоинство: корней сколько угодно, запись можно вносить сразу не заботясь о родителе, связь устанавливается потом (например из иннтерфейса)
тут шла речь о тригерах - с такой моделью кажется тоже проще, хотя я не любитель тригеров
Александр С. (2003-02-11 11:38:00) [6]Fiend © (11.02.03 11:32)
Было сказано:
> Если необходимоможно сделать несколько корней
, а зачем это нужно? Все зависит от предметной области..
Fiend (2003-02-11 11:32:00) [7]зачем несколько корней???
Александр С. (2003-02-11 11:30:00) [8]> Fiend © (11.02.03 11:11)
> какой изврат! Вах!
Изврат в чем?
Fiend (2003-02-11 11:11:00) [9]То Александр С.:
какой изврат! Вах!
Александр С. (2003-02-11 10:46:00) [10]>Wizard_Ex А Parent_ID уже должен существовать в таблице
Для этого можно вставить запись INSERT INTO...
(ID, PARENT)VALUES(0, 0)
и это будет корень, а уже потом вставлять корневые элементы (PARENT = 0)и т.д.
В запросах проверять WHERE ID <> PARENT, что бы не показывать корень.
Если необходимо можно сделать несколько корней
INSERT INTO...(ID, PARENT)VALUES(-100, -100)
INSERT INTO...(ID, PARENT)VALUES(-1000, -1000).
Fiend (2003-02-11 10:17:00) [11]упс, на ИБ один запросом не выйдет
могу привесть свою процедуру для MS SQL которая удаляет.
если надо приведу
Wizard_Ex (2003-02-11 06:41:00) [12]Только тогда проблема возникает при вставке Root ветвей
ID получаем при помощи генератора
А Parent_ID уже должен существовать в таблице
Больше интересно одним запросом и легко:
> Fiend © (10.02.03 16:54)
> а вообще можно и лёго выбрать одним запросом
Это как
Мне лично кажется можно еще и через ХП, но это уже не проще
Sergey Masloff (2003-02-10 20:39:00) [13]>Александр С. © (10.02.03 07:28)
>Если Parent связан с ID через FK,
>то для такой связи можно указать Action
>OnDelete - Cascade. И все..
Это тоже триггер... Только системный ;-)
jocko (2003-02-10 18:10:00) [14]2 Fiend
?
Fiend (2003-02-10 16:54:00) [15]а вообще можно и лёго выбрать одним запросом
Wizard_Ex (2003-02-10 15:17:00) [16]ХМ, попробую
это решение мне в голову не приходило
Александр С. (2003-02-10 07:28:00) [17]Если Parent связан с ID через FK,
то для такой связи можно указать Action
OnDelete - Cascade. И все..
ЮЮ (2003-02-10 06:30:00) [18]Триггер и сработает столько раз, сколько строк ты попытаешься удалить.
Wizard_Ex (2003-02-10 06:25:00) [19]Количество дочерних веток может быть любым
В том и проблема
Sergey Masloff (2003-02-09 18:23:00) [20]А в чем проблема? Удали ее и в триггере на удаление удали дочек.