Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Получить предпоследние 2 строки из древовидного запроса  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 430
Есть древовидный справочник подразделений.
Для получения цепочки подразделений в которой состоит конкретный работник, выполняю запрос типа
select *
from depts
connect by prior parent = id
start with id = :person_dept_id -- Id подразделения нижнего уровня в котором числится работник

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

\"Группа Java-разработки"
\"Отдел web-разработки"
\"Управление разработки"
\"Дирекция IT"
\"ООО Фирма"

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

\"Отдел web-разработки"
\"Управление разработки"
\"Дирекция IT"
\"ООО Фирма"

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

Сейчас я это делаю так:
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)

Но возможно есть способ "прямее"?
17 июн 20, 15:11    [22152432]     Ответить | Цитировать Сообщить модератору
 Re: Получить предпоследние 2 строки из древовидного запроса  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 291
SQL-Talker,
 level in (2,3) 
17 июн 20, 15:52    [22152466]     Ответить | Цитировать Сообщить модератору
 Re: Получить предпоследние 2 строки из древовидного запроса  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
1) sys_connect_by_path
2) отсортировать rn по убыванию и where rnnn in (2, 3)

....
stax
17 июн 20, 16:10    [22152486]     Ответить | Цитировать Сообщить модератору
 Re: Получить предпоследние 2 строки из древовидного запроса  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9899
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
/


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.

Сообщение было отредактировано: 17 июн 20, 17:07
17 июн 20, 17:08    [22152547]     Ответить | Цитировать Сообщить модератору
 Re: Получить предпоследние 2 строки из древовидного запроса  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 430
SY,

Спасибо! То что искал :)
17 июн 20, 17:43    [22152578]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить