|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Прошу помочь разобраться с извлечением иерархических данных из таблицы. Поля: 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)); возвращает Виды и Семейства, но Виды, которые сначала входят в Подсемейства - не показывает. Что тут сделать чтобы выводил все Виды? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2006, 22:55 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Ты бы хоть данные показал, что есть, что нужно получить. А то по запросам трудно чем-то помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2006, 09:54 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Итак, таблица TAXONS_TABL с полями: idsTAXON_TABL_ID - счетчик (назначение понятно) lngPARENT_ID - числовой (ссылается на idsTAXON_TABL_ID записи, которая является родителем) lngRANK - числовой (условное обозначение ранга на которые делятся все записи. Чем больше ранг, тем выше по иерархии таксон. Пока рангов 3: 1 - Виды, 9 - Подсемейства, 10 - Семейства, сколько будет всего - не знаю, но это неважно) chrTAXON_TABL - текстовый (название) Прилагаю (последовательно) скрины запросов: первого, второго (см. мой предыдущий пост) и "нужного". Т.е. в "нужном", сделанном на базе первого, помимо сопоставления записей в цепочке рангов 1>9>10, должны сопоставляться записи с рангом 1 записям с рангом 10 вне зависимости существуют ли для них промежуточные записи с рангом 9. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2006, 19:14 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2006, 19:15 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2006, 19:15 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Пардон. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2006, 19:16 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Прикрепи кусок базу, а то сам понимаешь, восстанвливать данные по скринам не очень весело. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2006, 08:38 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Пользователь2Прикрепи кусок базу, а то сам понимаешь, восстанвливать данные по скринам не очень весело. Шо, опять?! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2006, 10:21 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Итак, запускаем запрос "Количество видов" и убеждаемся, что видов - 5. Затем запускаем запрос "Связка видов подсемейств и семейств", возвращаются данные для 4 видов, т.к. для Бэмби категория "подсемейство" отсутствует. Что надо переделать в этом запросе, чтобы возвращалась запись для Бэмби? З.Ы. Как народ умудряется сжимать базы? Эта нет ничего, а места занимает почему-то много. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2006, 19:29 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2006, 19:30 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2006, 19:31 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Может, так подойдет: 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 Ну и сортировку добавить по вкусу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2006, 23:22 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Можно так, чуток покороче: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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2006, 08:20 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Круто! Спасибо большое! Пойду переваривать... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2006, 18:21 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Здравствуйте, Karfaqen! Это снова я :) И опять с глупыми вопросами. Если я правильно понял структуру запроса, то мы прослеживаем цепочки: Виды -> Семейства (если Вид еще не относится к Подсемейству, а сразу напрямую к Семейству) и Виды -> Подсемейства -> Семейства (ну, понятно). И если я правильно думаю, то при таком подходе (а другого я пока не вижу) и увеличении уровней иерархии наш запрос разрастется до невероятных размеров? Или не все так страшно? Т.е. к имеющимся добавляем: Виды -> Уровень ниже Подсемейства -> Подсемейства -> Семейства Виды -> Уровень ниже Подсемейства -> Семейства Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2006, 18:47 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
up ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2006, 18:18 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
КДИ если я правильно думаю, то при таком подходе (а другого я пока не вижу) и увеличении уровней иерархии наш запрос разрастется до невероятных размеров? Или не все так страшно? Т.е. к имеющимся добавляем: Виды -> Уровень ниже Подсемейства -> Подсемейства -> Семейства Виды -> Уровень ниже Подсемейства -> СемействаТипа, это вы только сейчас переварили? ;) Ну видимо так, разрастется конечно. Вобщем-то ничего сложного, может чуток громоздко, но зато регулярно. Иерархия - она ж масштабируемая, главное не запутаться в скобках IIF'ов и не уснуть от монотонности грамотно используемых алиасов ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2006, 20:18 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
> Типа, это вы только сейчас переварили? ;) Нет, не только сейчас. Просто сейчас возникла вновь необходимость обратиться к этому запросу, вернее, к подходу его формирования. > Вобщем-то ничего сложного, может чуток громоздко, но зато регулярно. Да нет, не чуток. Это я не совсем верно объяснил задачу. Дело в том, что промежуточные уровни иерархии могут отсутствовать для произвольных записей, но самый верхний и самый нижний уровни связаны всегда. А в этом случае мы должны рассмотреть все варианты цепочек, число которых при увеличении числа уровней иерархии растет угрожающими темпами. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 06:20 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
На сайте am.rusimport.ru есть статья про интервальные деревья. Я бы дал ссылку, но к сожалению сайт сейчас недоступен. Там выборки делаются просто, Но надо отслеживать вводимые данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 09:52 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Вот нашел Иерархия. Интервальное дерево. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 12:06 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Спасибо! Почитаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 18:44 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
КДДа нет, не чуток. Это я не совсем верно объяснил задачу. Дело в том, что промежуточные уровни иерархии могут отсутствовать для произвольных записей, но самый верхний и самый нижний уровни связаны всегда. А в этом случае мы должны рассмотреть все варианты цепочек, число которых при увеличении числа уровней иерархии растет угрожающими темпами.Да мне-то вы можете и вовсе не объяснять вашу задачу - я еще когда вам писал SQL для трех уровней, тогда уже предвидел, во что это выльется этот запрос, когда вы соберетесь задействовать все десять уровней ;) ИМХО, вполне решаемо - нудно конечно, да и запутаться с непривычки - раз плюнуть. Для 3-х уровней у вас все есть. Попробуйте начать с 4-х уровней, потом перейдите на 5-й, нащупайте регулярность, принцип добавления элементов запроса при увеличении уровней. Как вариант, попробуйте статические запросы сделать для всех n-связных цепочек, а потом уже на них основывайте логику IIF'ов конечного запроса - может вам проще будет ориентироваться. Успехов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 22:01 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Так, стоп. Оптимизм моего предыдущего поста основывался на том что, несмотря на то, что как вы пишете КДпромежуточные уровни иерархии могут отсутствовать(что было ясно с самого начала), я все же полагал, что при этом ЦЕПОЧКА СВЯЗИ ОСТАНЕТСЯ НЕПРЕРЫВНОЙ по уровням, то есть это будут варианты связей уровней, типа:1-10 1-9-10 1-8-9-10 и т.п.Если так, то предложенная ранее логика построения запроса сгодится - и несмотря на закономерный рост объема, такой запрос, масшабированный на все 10 уровней, даст вам то, что надо (если, конечно, вы при его написании не запутаетесь в уровнях ;) Но тут подумал я о скорбном. А могут ли промежуточные уровни отсутствовать не подряд, а выборочно-хаотично? Например, вид ссылается на некий класс 4-го уровня, а тот - сразу на подсемейство 9-го уровня? То есть - иерархия как бы есть, но она кусочно-НЕмонотонная? Такая как бы смута в вашем животном таксонстве? Если да, то вот с этими чудесами предложенный запрос точно не совладает. Я даже не стану пытаться представлять лесенки и коленца, которые придется выписывать, дабы реализовать его исходную логику. Напрашивается вывод - если на этой дорожке нас ждет обвал, то нормальные герои всегда идут в обход! Я тут пока писал, придумал радикально другой подход, сейчас мысль оформится, потыкаюсь чуток и сообщу ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 22:21 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
Что-то вроде получилось ;) Читайте почту по профильному адресу. Там база с примером для 10-и уровней и текстовый файл с пояснениями насчет сути запросов. Успехов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2006, 23:53 |
|
Запрос на выборку иерархических данных
|
|||
---|---|---|---|
#18+
>Такая как бы смута в вашем животном таксонстве? :)) Шедевр!!! Да, вот именно так дело и обстоит. И именно это я и имел ввиду в своем посте про "все варианты цепочек". Спасибо за ответ, гляну на работе то, что Вы прислали. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2006, 06:22 |
|
|
start [/forum/topic.php?fid=45&msg=34214717&tid=1654001]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 165ms |
0 / 0 |