@gadpaw

Как составить запрос в oracle sql?

Подскажите, пожалуйста, как составить запрос на выборку связей родительская запись - дочерняя?

Например, есть таблица id, parent_id, name.

как получить данные вида:

parent_id_1 id_1 name
parent_id_1 id_2 name
....

parent_id_2 id_1 name
parent_id_2 id_2 name
...

Т.е. идет родительский id и все его дочерние, потом следующий родительский id и его дочерние и т.д.
Упорядочивание по родительскому id, потом по дочерним.
  • Вопрос задан
  • 524 просмотра
Решения вопроса 1
@x_shader
Oracle & Coffee
Исходные данные
with t as(
  select 1 as chld_id, null as prnt_id, '1_name' as nm from dual union all
  select 3 as chld_id, 1 as prnt_id, '3_name' as nm from dual union all
  select 4 as chld_id, 1 as prnt_id, '4_name' as nm from dual union all
  select 6 as chld_id, 9 as prnt_id, '6_name' as nm from dual union all
  select 9 as chld_id, 3 as prnt_id, '9_name' as nm from dual union all
  select 12 as chld_id, 9 as prnt_id, '12_name' as nm from dual union all
  select 14 as chld_id, 9 as prnt_id, '14_name' as nm from dual union all
  select 15 as chld_id, 3 as prnt_id, '15_name' as nm from dual union all
  select 18 as chld_id, 9 as prnt_id, '18_name' as nm from dual
)


Если решать именно поставленную задачу, то нужно просто поменять последовательность столбцов и отсортировать.
Джойнить таблицу саму на себя нужно, если в выборке требуется не только ID родительского элемента, но и его имя.
select
 prnt_id, chld_id, nm
from t
where prnt_id is not null
order by 1,2


Можно поиграться чтоб увидеть всю иерархию:
select 
 prnt_id
,chld_id
,level
,lpad(' ', 4*level)||nm as hierarchy_
from t
start with prnt_id is null
connect by prior chld_id = prnt_id
order by prnt_id nulls first, chld_id;

(только не на больших таблицах в скоростном продакшне)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
select p.id as parent_id, c.id, c.name
from paren as p
join child as c on c.parent_id=p.id
order by p.id, c.id
Ответ написан
Комментировать
denman1985
@denman1985
SQL, Oracle Forms/Reports dbd
Обычное Декартово произведение. Перемножение таблицы на себя.
select a.parent_id, a.name, b.id 
from t1 a, t1 b
order by a.parent_id, b.id;
Ответ написан
Комментировать
@gadpaw Автор вопроса
Спасибо, за помощь, удалось вывести иерархию следующим запросом:

select connect_by_root ID PARENT_ID, ID
  from  dict
  connect by PARENT_ID = prior ID


Выводятся все родительские и все их дочерние, но остается вопрос, можно ли упорядочить вывод по моменту добавления данных в выборку? Т.е. обход дерева вглубь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы