Можно ли написать иерархический запрос в Oracle SQL, используя только объединения вместо использования предложения connect by - PullRequest
1 голос
/ 29 января 2020

Дано:

object_table
------------
ID
Parent

Пример данных:

ID : Parent 
 1  : null
 22 : 1
 45 : 22
 32 : 45

Запрос с использованием предложения connect by:

select * from object_table
start with id = 45
connect by prior parent = id;

Результат:

ID : Parent 
 45 : 22
 22 : 1
 1  : null

Можно ли написать запрос, который дает тот же результат, используя только объединения и не используя предложение connect by.

1 Ответ

3 голосов
/ 29 января 2020

Да, начиная с Oracle 11g Выпуска 2, вы можете использовать рекурсивные CTE вместо иерархических запросов старого стиля. Более того, рекурсивные CTE гораздо более гибкие, так как позволяют обходить любой график.

Например:

create table t (
  id number(6),
  parent number(6)
);

insert into t (id, parent) values (1, null);
insert into t (id, parent) values (22, 1);
insert into t (id, parent) values (45, 22);
insert into t (id, parent) values (32, 45);

with n (id, parent, lvl) as (
  select id, parent, 1 from t where id = 45
  union all
  select t.id, t.parent, n.lvl + 1
  from n
  join t on t.id = n.parent
)
select * from n order by lvl

Результат:

ID  PARENT  LVL
--  ------  ---
45      22    1
22       1    2
 1  <null>    3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...