Нужно показывать внука под ребенком под родителем в Oracle Иерархический запрос - PullRequest
0 голосов
/ 24 апреля 2011

У меня есть таблица, в которой есть дерево штатов, регионов, районов, зданий и классов.Каждая строка имеет идентификатор узла и идентификатор родителя.Я использую следующее

select name, child node, parent id from tableA  
connect by prior child node = parent id  

, которое я получаю:

CA  
  CENTRAL REGION  
    FRESNO DISTRICT  
     ST Jim BUILDING  
     ST joe BUILDING  
     st tom BUILDING  
     st sue BUILDING  
       JIMS CLASS  
       JOES CLASS  
       TOM CLASS  
       SUE CLASS  

Проблема в том, что на уровне здания все здания перечислены один за другим, а затем все классы один за другим.Однако я хочу перечислить здание и класс, который является родительским для следующего здания, следующим образом:

 FRESNO DISTRICT  
    st jim building  
      jims class  
    st joes building  
      joes class...  

идентификатор узла и идентификатор родителя верны, просто все дочерние элементы перечислены для родителя, а затем вседети для этого ребенка.это не показывает, какой ребенок идет с родителем.

Я хочу показать дерево сверху вниз, например, CA, Центральный регион, район Фресно, здание Св. Джо, класс Ms Mary, Ms

1 Ответ

3 голосов
/ 24 апреля 2011

Иерархический порядок должен быть сохранен, если только вы не используете ORDER BY без ключевого слова SIBLINGS.

select name, id, parent_id
from tableA
connect by prior id = parent_id
start with parent_id is null
order siblings by name;

Используя эти данные:

create table tableA(id number, name varchar2(100), parent_id number);

insert into tableA
select 1 id, 'CA' name, null parent_id from dual union all
select 2, 'CENTRAL REGION', 1 from dual union all
select 3, 'FRESNO DISTRICT', 2 from dual union all
select 4, 'ST Jim BUILDING', 3 from dual union all
select 5, 'ST joe BUILDING', 3 from dual union all
select 6, 'st tom BUILDING', 3 from dual union all
select 7, 'st sue BUILDING', 3 from dual union all
select 8, 'JIMS CLASS', 4 from dual union all
select 9, 'JOES CLASS', 5 from dual union all
select 10, 'TOM CLASS', 6 from dual union all
select 11, 'SUE CLASS', 7 from dual;
...