powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать всех потомков
14 сообщений из 14, страница 1 из 1
Выбрать всех потомков
    #32038352
chenosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с такой структурой:

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

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

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

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

select @i =  1 

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итого.

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

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

Вообще-то, сама идея хранения структуры отдельно от списка элементов не так уж плоха. Но надо ясно представлять достоинства и недостатки такого подхода применительно к конкретной задаче.
...
Рейтинг: 0 / 0
Выбрать всех потомков
    #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
Выбрать всех потомков
    #32040804
Sergey Vinogradov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: ВладимирМ

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

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

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


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