Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.03.03;
Скачать: [xml.tar.bz2];

Вниз

Дерево 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.046 c
1-5548
Кузнецова А.
2003-02-21 10:41
2003.03.03
QuickReport


14-5857
race1
2003-02-12 18:14
2003.03.03
en


6-5694
Nikk085
2003-01-12 17:48
2003.03.03
Проблемма соединения через инет!


1-5636
Ozone
2003-02-20 13:35
2003.03.03
Компоненты RUN-TIME


14-5826
ZeroDivide
2003-02-11 14:21
2003.03.03
Самая лучшая защита программы от нелегального пользования.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский