SQL вложенный запрос - группировать результаты по родителю - PullRequest
1 голос
/ 25 мая 2011

У меня есть необходимость возвращать результаты в виде дерева из одной таблицы. В данный момент я использую connect by и начнем с того, чтобы убедиться, что все правильные результаты возвращены.

select id,parent_id
     from myTable 
 connect by prior id = parent_id start with name = 'manager' 
     group by id, parent_id
 order by parent_id asc

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

Ожидаемые результаты

  - Parent A
   - child a
   - child b 
  - Parent B
   - child c
   - child d 

Фактические результаты

- Parent A 
- Parent B
- child a 
- child b 
- child c 
- child d

Возможно ли сделать это в оракуле? Моя таблица использует поле parent_id для определения, когда у строки есть родитель. Каждая строка также имеет порядок сортировки, то есть порядок, в котором она должна быть отсортирована по родительскому элементу, и уникальный идентификатор.

Я использую БД Oracle

Ответы [ 2 ]

5 голосов
/ 25 мая 2011

То, что вы хотите, это использовать ORDER SIBLINGS BY. Ваш запрос упорядочен по столбцу parent_id, который перекрывает любое иерархическое упорядочение.

Запрос ниже должен делать то, что вам нужно:

with my_hierarchy_data as (
  select 1 as id, null as parent_id, 'Manager' as name from dual union all
  select 2 as id, 1 as parent_id, 'parent 1' as name from dual union all
  select 3 as id, 1 as parent_id, 'parent 2' as name from dual union all
  select 4 as id, 2 as parent_id, 'child 1' as name from dual union all
  select 5 as id, 2 as parent_id, 'child 2' as name from dual union all
  select 6 as id, 3 as parent_id, 'child 3' as name from dual union all
  select 7 as id, 3 as parent_id, 'child 4' as name from dual 
)
select id, parent_id, lpad('- ', level * 2, ' ') || name as name
from my_hierarchy_data
connect by prior id = parent_id
start with name= 'Manager'
order siblings by parent_id asc
2 голосов
/ 25 мая 2011

Существует специальное значение level, которое можно использовать в иерархических запросах Oracle.Он возвращает 1 для строк на верхнем уровне иерархии, 2 для их дочерних элементов и т. Д.Вы можете использовать это для создания отступов:

select lpad('- ',level*2,' ') || name
     from myTable 
 connect by prior id = parent_id start with name = 'manager' 
     group by id, parent_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...