Конференция "Базы" » Помогите составить запрос...
 
  • Phoenix © (25.05.10 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 © (25.05.10 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 © (25.05.10 14:58) [2]

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

    Всё бы хорошо но так мы подсчитаем количество вложенностей для ОДНОГО элемента с id которого мы начинаем. А нужно ,если я правильно понял, суммы и для нижних элементов иерархии.
  • Sergey13 © (25.05.10 15:15) [3]
    > [2] Phoenix ©   (25.05.10 14:58)

    А попробовать не судьба?
  • Phoenix © (25.05.10 15:20) [4]

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

    Судьба, потому и говорю что попробовал.
  • Медвежонок Пятачок © (25.05.10 15:38) [5]
    То вот с второй половиной вопроса проблема - никак не могу сообразить, как посчитать количество подчинённых элементов для каждого элемента иерархии. Очень прошу помощи.

    каунт по id где parentid = id обрабатываемой записи
  • Sergey13 © (25.05.10 15:51) [6]
    > [4] Phoenix ©   (25.05.10 15:20)

    START в подзапросе надо переделать - я посто скопировал текст.
  • Phoenix © (25.05.10 16:00) [7]

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

    Каким образом не подскажете? Я тут день над запросом бьюсь ничего придумать не могу
  • Sergey13 © (25.05.10 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 © (25.05.10 16:30) [9]

    > Sergey13

    Огромное спасибо. Не знал что можно в подзапрос передавать параметры с общего запроса. Ещё раз спасибо - очень помогли!
  • Кщд © (26.05.10 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    

  • Кщд © (26.05.10 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    

 
Конференция "Базы" » Помогите составить запрос...
Есть новые Нет новых   [134433   +22][b:0][p:0.003]