-
Доброго времени суток камрады. Есть некая таблица в 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 То вот с второй половиной вопроса проблема - никак не могу сообразить, как посчитать количество подчинённых элементов для каждого элемента иерархии. Очень прошу помощи.
-
Можно попробовать вложенным запросом. 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-)
-
> Можно попробовать вложенным запросом.
Всё бы хорошо но так мы подсчитаем количество вложенностей для ОДНОГО элемента с id которого мы начинаем. А нужно ,если я правильно понял, суммы и для нижних элементов иерархии.
-
> [2] Phoenix © (25.05.10 14:58)
А попробовать не судьба?
-
> А попробовать не судьба?
Судьба, потому и говорю что попробовал.
-
То вот с второй половиной вопроса проблема - никак не могу сообразить, как посчитать количество подчинённых элементов для каждого элемента иерархии. Очень прошу помощи.
каунт по id где parentid = id обрабатываемой записи
-
> [4] Phoenix © (25.05.10 15:20)
START в подзапросе надо переделать - я посто скопировал текст.
-
> START в подзапросе надо переделать - я посто скопировал > текст.
Каким образом не подскажете? Я тут день над запросом бьюсь ничего придумать не могу
-
> [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
-
> Sergey13
Огромное спасибо. Не знал что можно в подзапрос передавать параметры с общего запроса. Ещё раз спасибо - очень помогли!
-
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
-
прошу прощения:
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
|