|
Запрос на отбор документов из иерархического списка.
|
|||
---|---|---|---|
#18+
У меня возникла проблема. Есть типичный список подчиненности. Таблица из двух полей Родитель-Ребенок (счетчик не всчет). У меня это документация. Задача - отобрать все документы, которые входят в произвольный узел. Сложности в том, что некоторые документы могут быть приложениями для других документов, причем на разных уровнях вложенности. Т.е. если просто сделать отбор всех упоминаний документов, то один и тот же документ может упоминаться несколько раз. А мне нужен список где документы упоминались бы только один раз. Раньше я пользовался вложенными Select-ами. Но тогда уровень вложенности был ограничен. А сейчас изменилась структура базы и уровень вложенности перестал быть ограничен. Конечно не 100, но с 3-х до 10-15 может возрасти запросто. Прошу совета. Можно ли сделать отбор одним запросом? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 10:32 |
|
Запрос на отбор документов из иерархического списка.
|
|||
---|---|---|---|
#18+
А чем так плохо? Правда, в таблице само собой, ещё есть поля iRealID (-1, если это и есть сам элемент и некий "настоящий" ID если это всего лишь ссылка на существующий элемент - какраз для того чтобы избежать повторов, если у когото больше одного родителя). Но функции принцип такой. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 10:43 |
|
Запрос на отбор документов из иерархического списка.
|
|||
---|---|---|---|
#18+
Ну, что сказать?... Мне не надо ни создавать, ни удалять ни базы, ни таблицы. Да и честно, сижу на солнечной стороне, кондишена нет, мозги плавятся, в тени +32, весь мокрый как мышь. Ни как не врублюсь. И в голову ничего подходящего не лезет. Может подробнее расписать? Есть таблица еидЫмофяю В ней два столбца: Parent и Childer. надо сформулировать запрос так, чтобы задав одно значение для Parent, получить всех Childer, входящих в него. Вложенность может быть любой (или хотя бы для фиксированной). И каждый Childer должен быть упомянут однократно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 17:46 |
|
Запрос на отбор документов из иерархического списка.
|
|||
---|---|---|---|
#18+
Jossнадо сформулировать запрос так, чтобы задав одно значение для Parent, получить всех Childer, входящих в негоИначе говоря, зная код некоторого узла, вам нужно найти все множество его потомков? Т.е. не полько прямых детей, но и внуков, правнуков и т.д., так? Тогда вы должны понимать, что в иерархической субд для того чтобы вытащить такую генеалогию запросом, вам придется в этом запросе резервировать всю цепочку join'ов на максимальную возможную глубину - которая при этом, понятное дело, должна быть конечна и заявлена в качестве предела возможностей вашего приложения. Если такое ограничение является для вас неприемлимым, тогда можно писать рекурсивную функцию на VB по сбору кодов всех потомков исходного предка (в массив, коллекцию, временную таблицу - в зависимости от дальнейших шагов). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 18:12 |
|
Запрос на отбор документов из иерархического списка.
|
|||
---|---|---|---|
#18+
Да, когда-то я и делал вложенные select на всю глубину, но сейчас хотел от этого избавиться. Но уж очень не хотелось создавать временные таблицы. Но если без этого не возможно, то наверное придется пойти этим путем. Создать временную таблицу, занести туда всё, что входит, начиная с верхнего узла и до пра-пра-пра..., а потом уже из этой таблицы сделать нужную выборку. Только не забыть её потом удалить. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 18:35 |
|
Запрос на отбор документов из иерархического списка.
|
|||
---|---|---|---|
#18+
JossДа, когда-то я и делал вложенные select на всю глубину, но сейчас хотел от этого избавиться. Но уж очень не хотелось создавать временные таблицы. Но если без этого не возможно, то наверное придется пойти этим путем. Создать временную таблицу, занести туда всё, что входит, начиная с верхнего узла и до пра-пра-пра..., а потом уже из этой таблицы сделать нужную выборку. Только не забыть её потом удалить. можно не удалять а перезаписывать в нее данные "поверх" ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 18:37 |
|
|
start [/forum/topic.php?fid=45&gotonew=1&tid=1648283]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 250ms |
total: | 420ms |
0 / 0 |