Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2012.04.22;
Скачать: [xml.tar.bz2];

Вниз

Помогите составить запрос...   Найти похожие ветки 

 
Phoenix ©   (2010-05-25 14:39) [0]

Доброго времени суток камрады.
Есть некая таблица в Oracle

TMP_PODRAZD
(ID   NUMBER not null,
ID_PARENT NUMBER not null,
NAME VARCHAR2(200))
в которой хранится иерархическая структура неких данных. К этой таблице имеется слудующее задание
"Построить запрос   отображающий дерево подразделений, со всеми подчиненными узлами начиная с заданного идентификатора (id). Для каждого подразделения отобразить кол-во подчиненных подразделений. "
И если с первой частью проблем не возникает
select a.id, a.id_parent,a.name
from tmp_podrazd a
START WITH a.id =(id элемента подчинённую структуру которого, хотим посмотреть)
CONNECT BY PRIOR a.id = a.id_parent
order by a.id
То вот с второй половиной вопроса проблема - никак не могу сообразить, как посчитать количество подчинённых элементов для каждого элемента иерархии. Очень прошу помощи.


 
Sergey13 ©   (2010-05-25 14:52) [1]

Можно попробовать вложенным запросом.

select a.id, a.id_parent,a.name, (select count()
                      from tmp_podrazd a
                      START WITH a.id =(id элемента подчинённую структуру которого, хотим посмотреть)
                      CONNECT BY PRIOR a.id = a.id_parent
                      ) as count_rec
from tmp_podrazd a
START WITH a.id =(id элемента подчинённую структуру которого, хотим посмотреть)
CONNECT BY PRIOR a.id = a.id_parent
order by a.id

Но тормоза практически обеспечены. 8-)


 
Phoenix ©   (2010-05-25 14:58) [2]


> Можно попробовать вложенным запросом.

Всё бы хорошо но так мы подсчитаем количество вложенностей для ОДНОГО элемента с id которого мы начинаем. А нужно ,если я правильно понял, суммы и для нижних элементов иерархии.


 
Sergey13 ©   (2010-05-25 15:15) [3]

> [2] Phoenix ©   (25.05.10 14:58)

А попробовать не судьба?


 
Phoenix ©   (2010-05-25 15:20) [4]


> А попробовать не судьба?

Судьба, потому и говорю что попробовал.


 
Медвежонок Пятачок ©   (2010-05-25 15:38) [5]

То вот с второй половиной вопроса проблема - никак не могу сообразить, как посчитать количество подчинённых элементов для каждого элемента иерархии. Очень прошу помощи.

каунт по id где parentid = id обрабатываемой записи


 
Sergey13 ©   (2010-05-25 15:51) [6]

> [4] Phoenix ©   (25.05.10 15:20)

START в подзапросе надо переделать - я посто скопировал текст.


 
Phoenix ©   (2010-05-25 16:00) [7]


> START в подзапросе надо переделать - я посто скопировал
> текст.

Каким образом не подскажете? Я тут день над запросом бьюсь ничего придумать не могу


 
Sergey13 ©   (2010-05-25 16:25) [8]

> [7] Phoenix ©   (25.05.10 16:00)
Как то так

select a.id, a.id_parent,a.name, (select count()
                     from tmp_podrazd b
                     START WITH b.id =a.id
                     CONNECT BY PRIOR b.id = b.id_parent
                     ) as count_rec
from tmp_podrazd a
START WITH a.id =(id элемента подчинённую структуру которого, хотим посмотреть)
CONNECT BY PRIOR a.id = a.id_parent
order by a.id


 
Phoenix ©   (2010-05-25 16:30) [9]


> Sergey13

Огромное спасибо. Не знал что можно в подзапрос передавать параметры с общего запроса. Ещё раз спасибо - очень помогли!


 
Кщд ©   (2010-05-26 08:52) [10]


with q as
         (
         select level lvl, e.*
         from tmp_podrazd e
         start with e.id = (id ýëåìåíòà ïîä÷èí¸ííóþ ñòðóêòóðó êîòîðîãî, õîòèì ïîñìîòðåòü)
         connect by prior e.id = e.boss
         ),
    h as (
         select k.root_id, k.root_lvl, k.root_id_parent, k.root_name, count(1) - 1
         from
             (
             select connect_by_root q.id root_id,
                    connect_by_root q.id_parent root_id_parent,
                    connect_by_root q.name root_name,
                    connect_by_root q.lvl root_lvl      
             from q q
             connect by prior q.id = q.id_parent
             ) k
         group by k.root_id, k.root_lvl, k.root_id_parent, k.root_name
         )
select h.*
from h h    


 
Кщд ©   (2010-05-26 08:53) [11]

прошу прощения:

with q as
         (
         select level lvl, e.*
         from tmp_podrazd e
         start with e.id = (id элемента подчинённую структуру которого, хотим посмотреть)
         connect by prior e.id = e.boss
         ),
    h as (
         select k.root_id, k.root_lvl, k.root_id_parent, k.root_name, count(1) - 1
         from
             (
             select connect_by_root q.id root_id,
                    connect_by_root q.id_parent root_id_parent,
                    connect_by_root q.name root_name,
                    connect_by_root q.lvl root_lvl      
             from q q
             connect by prior q.id = q.id_parent
             ) k
         group by k.root_id, k.root_lvl, k.root_id_parent, k.root_name
         )
select h.*
from h h    



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2012.04.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.003 c
2-1325178292
Gu
2011-12-29 21:04
2012.04.22
SizeOf


15-1324363262
oxffff
2011-12-20 10:41
2012.04.22
Может кто поделиться БД(продуктов и их иерархии) с фото


15-1323861558
картман
2011-12-14 15:19
2012.04.22
зима пришла...


2-1324826113
Pcrepair
2011-12-25 19:15
2012.04.22
idHTTP1 и закачка стр. из ЯНДЕКС.ру


6-1255153609
Leo50
2009-10-10 09:46
2012.04.22
Проблема с ScktSrvr.exe





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский