powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на выборку иерархических данных
25 сообщений из 29, страница 1 из 2
Запрос на выборку иерархических данных
    #33626054
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помочь разобраться с извлечением иерархических данных из таблицы.
Поля: idsTAXON_TABL_ID, lngPARENT_ID, lngRANK, chrTAXON_TABL
Данные относятся к 3 категориям: Виды (lngRANK = 1), которые входят в Подсемейства (lngRANK = 9), а они, в свою очередь в Семейства (lngRANK = 10).

Вот такой запрос
SELECT TAXONS_TABL_2.chrTAXON_TABL AS Семейство, TAXONS_TABL_1.chrTAXON_TABL AS Подсемейство, TAXONS_TABL.chrTAXON_TABL AS Виды
FROM (TAXONS_TABL INNER JOIN TAXONS_TABL AS TAXONS_TABL_1 ON TAXONS_TABL.lngPARENT_ID = TAXONS_TABL_1.idsTAXON_TABL_ID) INNER JOIN TAXONS_TABL AS TAXONS_TABL_2 ON TAXONS_TABL_1.lngPARENT_ID = TAXONS_TABL_2.idsTAXON_TABL_ID
WHERE (((TAXONS_TABL_2.lngRANK)=10) AND ((TAXONS_TABL_1.lngRANK)=9) AND ((TAXONS_TABL.lngRANK)=1))
возвращает Виды, Подсемейства и Семейства

а такой
SELECT TAXONS_TABL_1.chrTAXON_TABL AS Семейство, TAXONS_TABL.chrTAXON_TABL
FROM TAXONS_TABL LEFT JOIN TAXONS_TABL AS TAXONS_TABL_1 ON TAXONS_TABL.lngPARENT_ID = TAXONS_TABL_1.idsTAXON_TABL_ID
WHERE (((TAXONS_TABL_1.lngRANK)=10) AND ((TAXONS_TABL.lngRANK)<10));
возвращает Виды и Семейства, но Виды, которые сначала входят в Подсемейства - не показывает. Что тут сделать чтобы выводил все Виды?
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33626341
Ты бы хоть данные показал, что есть, что нужно получить. А то по запросам трудно чем-то помочь.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33628135
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, таблица TAXONS_TABL с полями:
idsTAXON_TABL_ID - счетчик (назначение понятно)
lngPARENT_ID - числовой (ссылается на idsTAXON_TABL_ID записи, которая является родителем)
lngRANK - числовой (условное обозначение ранга на которые делятся все записи. Чем больше ранг, тем выше по иерархии таксон. Пока рангов 3: 1 - Виды, 9 - Подсемейства, 10 - Семейства, сколько будет всего - не знаю, но это неважно)
chrTAXON_TABL - текстовый (название)

Прилагаю (последовательно) скрины запросов: первого, второго (см. мой предыдущий пост) и "нужного". Т.е. в "нужном", сделанном на базе первого, помимо сопоставления записей в цепочке рангов 1>9>10, должны сопоставляться записи с рангом 1 записям с рангом 10 вне зависимости существуют ли для них промежуточные записи с рангом 9.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33628137
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33628138
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33628140
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33628624
Прикрепи кусок базу, а то сам понимаешь, восстанвливать данные по скринам не очень весело.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33628801
ueeu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пользователь2Прикрепи кусок базу, а то сам понимаешь, восстанвливать данные по скринам не очень весело.
Шо, опять?!
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33633547
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, запускаем запрос "Количество видов" и убеждаемся, что видов - 5. Затем запускаем запрос "Связка видов подсемейств и семейств", возвращаются данные для 4 видов, т.к. для Бэмби категория "подсемейство" отсутствует. Что надо переделать в этом запросе, чтобы возвращалась запись для Бэмби?
З.Ы. Как народ умудряется сжимать базы? Эта нет ничего, а места занимает почему-то много.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33633549
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33633553
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33633793
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, так подойдет:
SELECT
IIf(T1.chrTAXON_TABL IS NULL,T3.chrTAXON_TABL,T2.chrTAXON_TABL) AS Семейство,
T1.chrTAXON_TABL AS Подсемейство,
T0.chrTAXON_TABL AS Виды
FROM
(SELECT * FROM TAXONS_TABL WHERE lngRANK=1) T0,
(SELECT * FROM TAXONS_TABL WHERE lngRANK=9) T1,
(SELECT * FROM TAXONS_TABL WHERE lngRANK=10) T2,
(SELECT * FROM TAXONS_TABL WHERE lngRANK=10) T3,
T0 LEFT JOIN T1 ON T0.lngPARENT_ID=T1.idsTAXON_TABL_ID,
T1 LEFT JOIN T2 ON T1.lngPARENT_ID=T2.idsTAXON_TABL_ID,
T0 LEFT JOIN T3 ON T0.lngPARENT_ID=T3.idsTAXON_TABL_ID
Ну и сортировку добавить по вкусу.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33634040
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так, чуток покороче:SELECT
IIf(T1.lngRANK=9,T2.chrTAXON_TABL,T1.chrTAXON_TABL) AS Семейство,
IIf(T1.lngRANK=9,T1.chrTAXON_TABL,'') AS Подсемейство,
T0.chrTAXON_TABL AS Виды
FROM
(SELECT * FROM TAXONS_TABL WHERE lngRANK=1) AS T0,
(SELECT * FROM TAXONS_TABL WHERE lngRANK>1) AS T1,
(SELECT * FROM TAXONS_TABL WHERE lngRANK=10) AS T2,
T0 LEFT JOIN T1 ON T0.lngPARENT_ID=T1.idsTAXON_TABL_ID,
T1 LEFT JOIN T2 ON T1.lngPARENT_ID=T2.idsTAXON_TABL_ID
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #33636038
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Круто! Спасибо большое! Пойду переваривать...
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34204321
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Karfaqen!
Это снова я :) И опять с глупыми вопросами.
Если я правильно понял структуру запроса, то мы прослеживаем цепочки:
Виды -> Семейства (если Вид еще не относится к Подсемейству, а сразу напрямую к Семейству) и Виды -> Подсемейства -> Семейства (ну, понятно).
И если я правильно думаю, то при таком подходе (а другого я пока не вижу) и увеличении уровней иерархии наш запрос разрастется до невероятных размеров? Или не все так страшно? Т.е. к имеющимся добавляем:
Виды -> Уровень ниже Подсемейства -> Подсемейства -> Семейства
Виды -> Уровень ниже Подсемейства -> Семейства
Так?
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34211309
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34211538
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КДИ если я правильно думаю, то при таком подходе (а другого я пока не вижу) и увеличении уровней иерархии наш запрос разрастется до невероятных размеров? Или не все так страшно? Т.е. к имеющимся добавляем:
Виды -> Уровень ниже Подсемейства -> Подсемейства -> Семейства
Виды -> Уровень ниже Подсемейства -> СемействаТипа, это вы только сейчас переварили? ;)

Ну видимо так, разрастется конечно. Вобщем-то ничего сложного, может чуток громоздко, но зато регулярно. Иерархия - она ж масштабируемая, главное не запутаться в скобках IIF'ов и не уснуть от монотонности грамотно используемых алиасов ;)
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34211848
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Типа, это вы только сейчас переварили? ;)
Нет, не только сейчас. Просто сейчас возникла вновь необходимость обратиться к этому запросу, вернее, к подходу его формирования.
> Вобщем-то ничего сложного, может чуток громоздко, но зато регулярно.
Да нет, не чуток. Это я не совсем верно объяснил задачу. Дело в том, что промежуточные уровни иерархии могут отсутствовать для произвольных записей, но самый верхний и самый нижний уровни связаны всегда. А в этом случае мы должны рассмотреть все варианты цепочек, число которых при увеличении числа уровней иерархии растет угрожающими темпами.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34212108
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сайте am.rusimport.ru есть статья про интервальные деревья. Я бы дал ссылку, но к сожалению сайт сейчас недоступен. Там выборки делаются просто, Но надо отслеживать вводимые данные.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34212605
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34214340
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Почитаю.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34214632
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КДДа нет, не чуток. Это я не совсем верно объяснил задачу. Дело в том, что промежуточные уровни иерархии могут отсутствовать для произвольных записей, но самый верхний и самый нижний уровни связаны всегда. А в этом случае мы должны рассмотреть все варианты цепочек, число которых при увеличении числа уровней иерархии растет угрожающими темпами.Да мне-то вы можете и вовсе не объяснять вашу задачу - я еще когда вам писал SQL для трех уровней, тогда уже предвидел, во что это выльется этот запрос, когда вы соберетесь задействовать все десять уровней ;)

ИМХО, вполне решаемо - нудно конечно, да и запутаться с непривычки - раз плюнуть.

Для 3-х уровней у вас все есть. Попробуйте начать с 4-х уровней, потом перейдите на 5-й, нащупайте регулярность, принцип добавления элементов запроса при увеличении уровней. Как вариант, попробуйте статические запросы сделать для всех n-связных цепочек, а потом уже на них основывайте логику IIF'ов конечного запроса - может вам проще будет ориентироваться.

Успехов.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34214640
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, стоп. Оптимизм моего предыдущего поста основывался на том что, несмотря на то, что как вы пишете КДпромежуточные уровни иерархии могут отсутствовать(что было ясно с самого начала), я все же полагал, что при этом ЦЕПОЧКА СВЯЗИ ОСТАНЕТСЯ НЕПРЕРЫВНОЙ по уровням, то есть это будут варианты связей уровней, типа:1-10
1-9-10
1-8-9-10
и т.п.Если так, то предложенная ранее логика построения запроса сгодится - и несмотря на закономерный рост объема, такой запрос, масшабированный на все 10 уровней, даст вам то, что надо (если, конечно, вы при его написании не запутаетесь в уровнях ;)

Но тут подумал я о скорбном.
А могут ли промежуточные уровни отсутствовать не подряд, а выборочно-хаотично? Например, вид ссылается на некий класс 4-го уровня, а тот - сразу на подсемейство 9-го уровня? То есть - иерархия как бы есть, но она кусочно-НЕмонотонная? Такая как бы смута в вашем животном таксонстве?

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

Напрашивается вывод - если на этой дорожке нас ждет обвал, то нормальные герои всегда идут в обход! Я тут пока писал, придумал радикально другой подход, сейчас мысль оформится, потыкаюсь чуток и сообщу ;)
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34214717
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вроде получилось ;)

Читайте почту по профильному адресу. Там база с примером для 10-и уровней и текстовый файл с пояснениями насчет сути запросов.

Успехов.
...
Рейтинг: 0 / 0
Запрос на выборку иерархических данных
    #34214841
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Такая как бы смута в вашем животном таксонстве?
:)) Шедевр!!!
Да, вот именно так дело и обстоит. И именно это я и имел ввиду в своем посте про "все варианты цепочек". Спасибо за ответ, гляну на работе то, что Вы прислали.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на выборку иерархических данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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