Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.22;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
2-1325109344
TThread
2011-12-29 01:55
2012.04.22
TPotok_Com.Terminate


3-1274429485
RWolf
2010-05-21 12:11
2012.04.22
План запроса vs. время выполнения


2-1324569664
brother
2011-12-22 20:01
2012.04.22
Закрытие файла...


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


15-1324326603
Юрий
2011-12-20 00:30
2012.04.22
С днем рождения ! 20 декабря 2011 вторник