|
|
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Есть таблица с такой структурой: ....... id int id_prev int - ссылка на id родителя ....... Как одним запросом выбрать всех потомков для заданного id=@id ? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2002, 18:58:27 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Прямых - наверное сам догадываешься. А непрямых - только рекурсией... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2002, 19:16:33 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
А одним запросом - это как Код: plaintext 1. 2. 3. 4. 5. 6. -это сколько запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2002, 19:18:53 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Сколько потребуется - столько и будет... А вы что думаете - конструкция CONNECT BY в Oracle иначе работает? Точно также, просто ввели удобный оператор... ЗЫ Можно делать иначе. Можно создать поле типа varchar(1024) и поддерживать (в триггере) полный путь к объекту. Тогда поиск всех потомков будет как LIKE 'Часть пути%' , где "Часть пути" - полный путь к родителю, для которого ищем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2002, 19:42:10 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Може я чего не понял(не исключенно),но если есть id предка то он должен гдн-то под етим id храниться,почему-бы не проитись по table parents и не отобрать всех прямых потомков...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2002, 20:47:37 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Есть и другие варианты поддержки иерархии: Если специально поддерживать дополнительные поля (или таблицу), то запросы получаются легко и быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2002, 05:16:21 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Извиняюсь за неудачную ссылку: Моделирование иерархических объектов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2002, 05:25:10 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
http://support.microsoft.com/default.aspx?scid=KB;EN-US;q248915& ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2002, 14:30:35 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Сергей Виноградов, спасибо за отличную статью! Уже второй день бьюсь с подобной задачей. Удивляюсь, как сам до такого не додумался (вспом. таблица). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2002, 14:04:52 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
По поводу статьи Sergey Vinogradov Забавно, что указывая в качестве недостатка схемы предложеной Joe Celko сложность модификации он не видит точно такого же недостатка в своей собственной схеме. Из того, что предложенная им схема более понятна для большинства пользователей вовсе не следует что ее сопровождение потребует меньших усилий. И, повторяя слова Sergey Vinogradov , есть и другие варианты поддержки иерархии. http://www.osp.ru/win2000/sql/967.htm Ну, а лично я вообще ввел сквозной порядковый номер по всему дереву. На самом деле, вариантов хранения иерархических структур очень много. Какой из них выбрать зависит от конкретной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2002, 14:37:04 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
To: ВладимирМ Где же там сложность? Вся модификация делается в триггерах двумя-тремя запросами (конечно, если использовать уже построенную вспомогательную таблицу). Первоначальное заполнение - простым скриптом с курсором. И сопровождать ничего не надо. Не приводил тексты запросов в статье только потому, что посчитал их достаточно очевидными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 07:28:53 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Sergey Vinogradov При работе со структурой дерева есть 3 стандартные задачи: 1. Создание нового узла 2. Удаление узла и всех его потомков 3. Перемещение узла (смена родителя) Первая задача решается просто при любом способе Вторая задача - относительно просто. Если использовать триггер, то в Вашей постановке это практически ничем не отличается от "классической" схемы, поскольку потребуется рекурсия Третья задача - по сложности сопоставима с реализацией в схеме Joe Celko Я так прикинул что для этого потребуется - не очень-то просто это все выглядит. Еще о некоторых недостатках вашей схемы: Схема предложенная Joe Celko создает жесткую структуру дерева в том смысле, что зафиксирован порядок следования узлов друг за другом. В "классическом" варианте, впрочем как и в вашем - этого нет. Остается рассчитывать только на алфавитный порядок. В моей задаче это имеет принципиальное значение, поскольку узлы следуют не в алфавитном порядке и менять этот порядок недопустимо. Да и в большинстве случаев недостаточно знать список всех потомков или список всех родителей. Требуется еще знать "кто за кем стоял". Не в смысле следования узлов на одном уровне, а в смысле кто чей родитель в полученном списке потомков (родителей). Этого ваша схема не решает. Итого. Ваша схема позволяет решать задачи типа "один или все", т.е. можно ответить на вопрос: Список прямых потомков (предков) или список всех потомков (предков). Все. Для более сложных задач она не годится. Да, конечно, можно ввести еще дополнительное поле "уровень вложенности", но это усложнит уже сопровождение (модификацию) структуры. Вообще-то, сама идея хранения структуры отдельно от списка элементов не так уж плоха. Но надо ясно представлять достоинства и недостатки такого подхода применительно к конкретной задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 10:58:30 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
Посмотри, что-то типа ентого должно получицца. У меня таблица 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 никаких рекурсий никакой трататы просто и сердито работает намана ну по крайней мере у меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2002, 17:55:25 |
|
||
|
Выбрать всех потомков
|
|||
|---|---|---|---|
|
#18+
To: ВладимирМ >Третья задача - по сложности сопоставима с реализацией в схеме Joe Celko Я так прикинул что для этого потребуется - не очень-то просто это все выглядит. :-) Плохо прикидывали, значит. Мне что, правда, скрипты предъявить, раз народ совсем думать самостоятельно не хочет? А я все намекал и намекал на тот факт, что при модификации вспомогательной таблицы можно использовать ее саму же. Тогда все получается так просто, что проще уже некуда. А если "в лоб" пытаться, то конечно... Задача выяснить "кто за кем стоял" у нас попадается редко (в основном надо максимально просто и быстро получить потомков заданного предка), но поля Level и Terminal в основных таблицах обычно поддерживаются (автоматически) - на всякий случай. И иногда они действительно пригождаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2002, 05:05:23 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1821376]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 356ms |

| 0 / 0 |
