Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать всех потомков / 14 сообщений из 14, страница 1 из 1
23.07.2002, 18:58:27
    #32038352
chenosov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Есть таблица с такой структурой:

.......
id int
id_prev int - ссылка на id родителя
.......

Как одним запросом выбрать всех потомков для заданного
id=@id ?

Спасибо
...
Рейтинг: 0 / 0
23.07.2002, 19:16:33
    #32038362
Сергей Тихонов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Прямых - наверное сам догадываешься.
А непрямых - только рекурсией...
...
Рейтинг: 0 / 0
23.07.2002, 19:18:53
    #32038363
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
А одним запросом - это как

Код: plaintext
1.
2.
3.
4.
5.
6.
declare @i int

select @i =  1 

select [i] = @i
select [j] = @i
go


-это сколько запросов?
...
Рейтинг: 0 / 0
23.07.2002, 19:42:10
    #32038370
Сергей Тихонов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Сколько потребуется - столько и будет...
А вы что думаете - конструкция CONNECT BY в Oracle иначе работает? Точно также, просто ввели удобный оператор...

ЗЫ
Можно делать иначе. Можно создать поле типа varchar(1024) и поддерживать (в триггере) полный путь к объекту. Тогда поиск всех потомков будет как LIKE 'Часть пути%' , где "Часть пути" - полный путь к родителю, для которого ищем...
...
Рейтинг: 0 / 0
23.07.2002, 20:47:37
    #32038379
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Може я чего не понял(не исключенно),но если есть id предка то он должен гдн-то под етим id храниться,почему-бы не проитись по table parents и не отобрать всех прямых потомков......
...
Рейтинг: 0 / 0
24.07.2002, 05:16:21
    #32038392
Sergey Vinogradov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Есть и другие варианты поддержки иерархии:


Если специально поддерживать дополнительные поля (или таблицу), то запросы получаются легко и быстро.
...
Рейтинг: 0 / 0
24.07.2002, 05:25:10
    #32038393
Sergey Vinogradov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Извиняюсь за неудачную ссылку:
Моделирование иерархических объектов
...
Рейтинг: 0 / 0
24.07.2002, 14:30:35
    #32038496
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
http://support.microsoft.com/default.aspx?scid=KB;EN-US;q248915&
...
Рейтинг: 0 / 0
25.07.2002, 14:04:52
    #32038773
Slavick Shibayev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Сергей Виноградов, спасибо за отличную статью! Уже второй день бьюсь с подобной задачей. Удивляюсь, как сам до такого не додумался (вспом. таблица).
...
Рейтинг: 0 / 0
25.07.2002, 14:37:04
    #32038793
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
По поводу статьи Sergey Vinogradov

Забавно, что указывая в качестве недостатка схемы предложеной Joe Celko сложность модификации он не видит точно такого же недостатка в своей собственной схеме.

Из того, что предложенная им схема более понятна для большинства пользователей вовсе не следует что ее сопровождение потребует меньших усилий.

И, повторяя слова Sergey Vinogradov , есть и другие варианты поддержки иерархии.

http://www.osp.ru/win2000/sql/967.htm

Ну, а лично я вообще ввел сквозной порядковый номер по всему дереву.

На самом деле, вариантов хранения иерархических структур очень много. Какой из них выбрать зависит от конкретной задачи.
...
Рейтинг: 0 / 0
26.07.2002, 07:28:53
    #32038927
Sergey Vinogradov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
To: ВладимирМ

Где же там сложность?
Вся модификация делается в триггерах двумя-тремя запросами (конечно, если использовать уже построенную вспомогательную таблицу).
Первоначальное заполнение - простым скриптом с курсором. И сопровождать ничего не надо.

Не приводил тексты запросов в статье только потому, что посчитал их достаточно очевидными.
...
Рейтинг: 0 / 0
26.07.2002, 10:58:30
    #32038987
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Sergey Vinogradov

При работе со структурой дерева есть 3 стандартные задачи:

1. Создание нового узла
2. Удаление узла и всех его потомков
3. Перемещение узла (смена родителя)

Первая задача решается просто при любом способе

Вторая задача - относительно просто. Если использовать триггер, то в Вашей постановке это практически ничем не отличается от "классической" схемы, поскольку потребуется рекурсия

Третья задача - по сложности сопоставима с реализацией в схеме Joe Celko Я так прикинул что для этого потребуется - не очень-то просто это все выглядит.

Еще о некоторых недостатках вашей схемы:

Схема предложенная Joe Celko создает жесткую структуру дерева в том смысле, что зафиксирован порядок следования узлов друг за другом.

В "классическом" варианте, впрочем как и в вашем - этого нет. Остается рассчитывать только на алфавитный порядок. В моей задаче это имеет принципиальное значение, поскольку узлы следуют не в алфавитном порядке и менять этот порядок недопустимо.

Да и в большинстве случаев недостаточно знать список всех потомков или список всех родителей. Требуется еще знать "кто за кем стоял". Не в смысле следования узлов на одном уровне, а в смысле кто чей родитель в полученном списке потомков (родителей). Этого ваша схема не решает.

Итого.

Ваша схема позволяет решать задачи типа "один или все", т.е. можно ответить на вопрос: Список прямых потомков (предков) или список всех потомков (предков). Все. Для более сложных задач она не годится.

Да, конечно, можно ввести еще дополнительное поле "уровень вложенности", но это усложнит уже сопровождение (модификацию) структуры.

Вообще-то, сама идея хранения структуры отдельно от списка элементов не так уж плоха. Но надо ясно представлять достоинства и недостатки такого подхода применительно к конкретной задаче.
...
Рейтинг: 0 / 0
02.08.2002, 17:55:25
    #32040702
Midgard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
Посмотри, что-то типа ентого должно получицца.
У меня таблица Nodes ( NodeId, ParentNodeID )

выбираем все дочерние для NodeID = @NodeID

create table #NeededNodes
(
NodeID int ,
Checked bit
)
create table #SelectedNode
(
NodeID int
)
insert into #NeededNodes ( NodeID , Checked)
select
NodeID , 0
from
Nodes
where
NodeID = @NodeID
while exists ( select Nodes . NodeID from Nodes inner join #NeededNodes on Nodes . ParentNodeID = #NeededNodes . NodeID where #NeededNodes. Checked = 0 )
begin
insert into #SelectedNode ( NodeID )
select Nodes . NodeID from Nodes inner join #NeededNodes on Nodes . ParentNodeID = #NeededNodes . NodeID where #NeededNodes. Checked = 0
update
#NeededNodes
set
Checked = 1
insert into #NeededNodes ( NodeID , Checked )
select
NodeID ,
0
from
#SelectedNode
delete
from
#SelectedNode
end

select * from #NeededNodes

никаких рекурсий никакой трататы просто и сердито
работает намана ну по крайней мере у меня.
...
Рейтинг: 0 / 0
05.08.2002, 05:05:23
    #32040804
Sergey Vinogradov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать всех потомков
To: ВладимирМ

>Третья задача - по сложности сопоставима с реализацией в схеме Joe Celko Я так прикинул что для этого потребуется - не очень-то просто это все выглядит.

:-)
Плохо прикидывали, значит.
Мне что, правда, скрипты предъявить, раз народ совсем думать самостоятельно не хочет?
А я все намекал и намекал на тот факт, что при модификации вспомогательной таблицы можно использовать ее саму же.
Тогда все получается так просто, что проще уже некуда.
А если "в лоб" пытаться, то конечно...

Задача выяснить "кто за кем стоял" у нас попадается редко (в основном надо максимально просто и быстро получить потомков заданного предка), но поля Level и Terminal в основных таблицах обычно поддерживаются (автоматически) - на всякий случай. И иногда они действительно пригождаются.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать всех потомков / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]