Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.03;
Скачать: CL | DM;

Вниз

Дерево SQL - удаление дочерних веток   Найти похожие ветки 

 
Wizard_Ex ©   (2003-02-09 17:02) [0]

Есть таблица
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 и ее тоже, т.е ветку Бета с дочерними ветками.


 
Sergey Masloff   (2003-02-09 18:23) [1]

А в чем проблема? Удали ее и в триггере на удаление удали дочек.


 
Wizard_Ex ©   (2003-02-10 06:25) [2]

Количество дочерних веток может быть любым
В том и проблема


 
ЮЮ ©   (2003-02-10 06:30) [3]

Триггер и сработает столько раз, сколько строк ты попытаешься удалить.


 
Александр С. ©   (2003-02-10 07:28) [4]

Если Parent связан с ID через FK,
то для такой связи можно указать Action
OnDelete - Cascade. И все..


 
Wizard_Ex ©   (2003-02-10 15:17) [5]

ХМ, попробую
это решение мне в голову не приходило


 
Fiend ©   (2003-02-10 16:54) [6]

а вообще можно и лёго выбрать одним запросом


 
jocko   (2003-02-10 18:10) [7]

2 Fiend
?


 
Sergey Masloff   (2003-02-10 20:39) [8]

>Александр С. © (10.02.03 07:28)
>Если Parent связан с ID через FK,
>то для такой связи можно указать Action
>OnDelete - Cascade. И все..
Это тоже триггер... Только системный ;-)


 
Wizard_Ex ©   (2003-02-11 06:41) [9]

Только тогда проблема возникает при вставке Root ветвей
ID получаем при помощи генератора
А Parent_ID уже должен существовать в таблице

Больше интересно одним запросом и легко:

> Fiend © (10.02.03 16:54)
> а вообще можно и лёго выбрать одним запросом


Это как
Мне лично кажется можно еще и через ХП, но это уже не проще


 
Fiend ©   (2003-02-11 10:17) [10]

упс, на ИБ один запросом не выйдет
могу привесть свою процедуру для MS SQL которая удаляет.
если надо приведу


 
Александр С. ©   (2003-02-11 10:46) [11]

>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 11:11) [12]

То Александр С.:
какой изврат! Вах!


 
Александр С. ©   (2003-02-11 11:30) [13]

> Fiend © (11.02.03 11:11)
> какой изврат! Вах!
Изврат в чем?



 
Fiend ©   (2003-02-11 11:32) [14]

зачем несколько корней???


 
Александр С. ©   (2003-02-11 11:38) [15]

Fiend © (11.02.03 11:32)
Было сказано:
> Если необходимо можно сделать несколько корней
, а зачем это нужно? Все зависит от предметной области..


 
jocko   (2003-02-11 14:03) [16]

по поводу корней и вообще дерева, повторюсь (вообще этот вопрос недавно поднимался)
так вот, скачем от печки: осн. правило есть объект - есть таблица.
объектов 2:
1. непосредственно сущность которую описываем (например "единицы
измерения": id, название)
2. соотношения между ними (id, parent_id, соответствие)
(пример чисто для наглядности)
достоинство: корней сколько угодно, запись можно вносить сразу не заботясь о родителе, связь устанавливается потом (например из иннтерфейса)
тут шла речь о тригерах - с такой моделью кажется тоже проще, хотя я не любитель тригеров


 
Wizard_Ex ©   (2003-02-12 07:43) [17]

Вопрос по той же теме

можно ли запросом сделать выборку все веток кроме ветки Бета и ее дочерних веток

однако
насчет следующего согласен

> Александр С. © (11.02.03 10:46)


при вставке корня ID и Parent_ID должны быть равны иначе Foreign key не даст вставить запись



 
Александр С. ©   (2003-02-12 07:55) [18]

> можно ли запросом сделать выборку все веток кроме ветки Бета и ее дочерних веток
Просто запросом ИМХО нельзя.
Рекурсия в ХП из которой исключается ветка Бета.
Но при большом количестве записей записей возможны проблеммы.


 
Кило   (2003-02-12 10:04) [19]

А как написать в тригере (до удаления) чтобы удалялись дочери?


 
Александр С. ©   (2003-02-12 12:22) [20]

Delete from <TableName> where Parent = Old.ID



Страницы: 1 вся ветка

Текущий архив: 2003.03.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
4-5925
Учитель(Ученик)
2003-01-14 06:35
2003.03.03
ХР


1-5491
Silver_
2003-02-20 17:47
2003.03.03
TActionMainMenuBar


9-5375
Стас
2002-09-06 13:58
2003.03.03
навигация в космосе


3-5423
boka
2003-02-11 23:14
2003.03.03
DBGrid


14-5720
MBo
2003-02-14 17:38
2003.03.03
Pascal and its Successors - Niklaus Wirth