powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить предпоследние 2 строки из древовидного запроса
5 сообщений из 5, страница 1 из 1
Получить предпоследние 2 строки из древовидного запроса
    #39970229
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть древовидный справочник подразделений.
Для получения цепочки подразделений в которой состоит конкретный работник, выполняю запрос типа
Код: plsql
1.
2.
3.
4.
select *
from depts
connect by prior parent = id
start with id = :person_dept_id -- Id подразделения нижнего уровня в котором числится работник


В зависимости от подразделения, от работника цепочка может быть разной длины:
Скажем, для разраба цепочка из 5 элементов:

Код: plaintext
1.
2.
3.
4.
5.
\"Группа Java-разработки"
    \"Отдел web-разработки"
        \"Управление разработки"
            \"Дирекция IT"
                \"ООО Фирма"

А для нач. отдела цепочка короче:

Код: plaintext
1.
2.
3.
4.
\"Отдел web-разработки"
    \"Управление разработки"
        \"Дирекция IT"
            \"ООО Фирма"

Мне нужно для любого конкретного работника получить Название дирекции и Название управления .
Никаких атрибутов указывающих на то что данная запись - дирекция, управление или еще что-то нет.
Ориентироваться можно только на то что дирекции это элементы второго уровня, а управления - третьего

Сейчас я это делаю так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from (
    select z.*, rownum rn
    from (
        select *
        from depts
        connect by prior parent = id
        start with id = :person_dept_id -- Id подразделения нижнего уровня в котором числится работник
        order by level desc
    ) z
)
where rn in (2, 3)


Но возможно есть способ "прямее"?
...
Рейтинг: 0 / 0
Получить предпоследние 2 строки из древовидного запроса
    #39970251
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,
Код: plsql
1.
 level in (2,3) 
...
Рейтинг: 0 / 0
Получить предпоследние 2 строки из древовидного запроса
    #39970259
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) sys_connect_by_path
2) отсортировать rn по убыванию и where rnnn in (2, 3)

....
stax
...
Рейтинг: 0 / 0
Получить предпоследние 2 строки из древовидного запроса
    #39970297
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with z as (
           select  d.*,
                   connect_by_isleaf + lead(connect_by_isleaf,1,0) over(order by level) flag
             from  depts d
             connect by prior parent = id
             start with id = :person_dept_id -- Id подразделения нижнего уровня в котором числится работник
          )
select  *
  from  z
  where flag = 1
/



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with z as (
           select  d.*,
                   max(level) over() - level flag
             from  depts d
             connect by prior parent = id
             start with id = :person_dept_id -- Id подразделения нижнего уровня в котором числится работник
          )
select  *
  from  z
  where flag <= 1
/



SY.
...
Рейтинг: 0 / 0
Получить предпоследние 2 строки из древовидного запроса
    #39970313
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Спасибо! То что искал :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить предпоследние 2 строки из древовидного запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]