Как получить верхний элемент определенного типа? - PullRequest
0 голосов
/ 27 августа 2018

Допустим, у меня есть что-то похожее на это (иерархия папок на диске C :).

Я хочу получить верхнюю папку данной папки (в данном случае я выбрал '1'), а не сам диск, как мне это сделать?

Иерархия может иметь различные уровни.

with data as 
(
select '1' name, 'folder' type, 'docs' parent from dual union
select '2' name, 'folder' type, 'docs' parent from dual union
select '3' name, 'folder' type, 'docs' parent from dual union
select 'docs' name, 'folder' type, 'MyFolder' parent from dual union
select 'MyFolder' name, 'folder' type, 'C:\' parent from dual union
select 'C:\' name, 'Drive' type, null parent from dual 
)
select name, level from data
start with name = '1'
connect by prior parent = name
order by level;

ожидаемый вывод: 'Myfolder', так как у него нет другой папки в качестве родительского.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Пожалуйста, попробуйте ниже,

    WITH data
     AS (SELECT '1' name, 'folder' TYPE, 'docs' parent FROM DUAL
         UNION
         SELECT '2' name, 'folder' TYPE, 'docs' parent FROM DUAL
         UNION
         SELECT '3' name, 'folder' TYPE, 'docs' parent FROM DUAL
         UNION
         SELECT 'docs' name, 'folder' TYPE, 'MyFolder' parent FROM DUAL
         UNION
         SELECT 'MyFolder' name, 'folder' TYPE, 'C:\' parent FROM DUAL
         UNION
         SELECT 'C:\' name, 'Drive' TYPE, NULL parent FROM DUAL)
    SELECT name
      FROM data
     WHERE parent = (SELECT name
                       FROM data
                      WHERE TYPE = 'Drive')
START WITH name = '1'
CONNECT BY PRIOR parent = name

выход

   NAME    
--------
MyFolder

Проведите тестирование на реальных данных и сообщите нам результат.

0 голосов
/ 27 августа 2018

Вот один из вариантов:

SQL> with data as
  2  (
  3  select '1' name       , 'folder' type, 'docs'     parent from dual union
  4  select '2' name       , 'folder' type, 'docs'     parent from dual union
  5  select '3' name       , 'folder' type, 'docs'     parent from dual union
  6  select 'docs' name    , 'folder' type, 'MyFolder' parent from dual union
  7  select 'MyFolder' name, 'folder' type, 'C:\'      parent from dual union
  8  select 'C:\' name     , 'Drive'  type, null       parent from dual
  9  ),
 10  inter as
 11    (select name, level lvl, type
 12     from data
 13     start with name = '1'
 14     connect by prior parent = name
 15    )
 16  select name
 17  from inter
 18  where lvl = (select max(lvl) from inter
 19               where type = 'folder');

NAME
--------
MyFolder

SQL>
...