Иерархический запрос Oracle объединяется с выбором всех потомков

Я пытаюсь получить список каждого потомка с каждым элементом. Я не уверен, что я имею смысл, я попытаюсь объяснить.

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

ID | PID
--------
1  | 0
2  | 1
3  | 1
4  | 1
5  | 2
6  | 2
7  | 5
8  | 3

и т.д...

Желаемые результаты:

ID | Decendant
--------------
1  | 1
1  | 2
1  | 3
1  | 4
...
2  | 2
2  | 5
2  | 6
2  | 7
3  | 3
3  | 8

и т.д...

В настоящее время это достигается за счет использования курсора для перемещения по данным и вставки каждого потомка в таблицу, а затем выбора из них.

Мне было интересно, есть ли лучший способ сделать это, должен быть способ исправить запрос, который вернет желаемые результаты.

Если у кого-то есть идеи или кто-то понял это раньше, это будет очень признательно. Порядок не важен, равно как и ссылка 1-1, 2-2. Было бы круто иметь его, но не критично.


person JonathanPeel    schedule 06.02.2014    source источник
comment
Уверены ли вы? 1-4 подходит? С какими примерными данными, показанными здесь. Извините, я запутался со столбцом PID!   -  person Maheswaran Ravisankar    schedule 06.02.2014
comment
PID — это родительский идентификатор, возможно, мне следовало указать это, поэтому родительский идентификатор 4 равен 1. Таким образом, 4 является потомком 1, поэтому 1–4 допустимы.   -  person JonathanPeel    schedule 06.02.2014
comment
@OracleUser, если вы считаете, что мой вопрос сбивает с толку, я могу попробовать переформулировать его, но я не уверен, как это сделать.   -  person JonathanPeel    schedule 06.02.2014
comment
кажется я понял! Кроме того, кажется, что каждый идентификатор является потомком самого себя.   -  person Maheswaran Ravisankar    schedule 06.02.2014
comment
Я бы хотел, чтобы это отображалось в результатах таким образом, но это не обязательно, я могу легко обойти это, если это не так.   -  person JonathanPeel    schedule 06.02.2014


Ответы (2)


select connect_by_root(id) as ID, id as Decendant
from table1
connect by prior id = pid
order by 1, 2

скрипка

person Egor Skriptunoff    schedule 06.02.2014
comment
это действительно сработало, большое спасибо. Я предполагаю, что это как-то связано с connect_by_root()? Я посмотрю, это не то, с чем я сталкивался раньше. У меня есть пользователь, подключающийся ранее, но только для более плоского списка. - person JonathanPeel; 06.02.2014

Вот моя попытка! Не уверен, правильно ли я вас понял!

select pid ,connect_By_root(id) as descendant from process
connect by  id = prior pid
union all
select distinct pid,pid from
process
order by pid,descendant
person Maheswaran Ravisankar    schedule 06.02.2014
comment
Это именно то, что я искал, удивительно, насколько простыми могут быть некоторые запросы Oracle. - person JonathanPeel; 06.02.2014
comment
@JonathanPeel Круто .. Верхняя часть идентифицирует родителя .. и отслеживает всех его дочерних элементов .. нижняя часть - это ваше дополнительное требование, сопоставьте PArent с самим PArent! - person Maheswaran Ravisankar; 06.02.2014
comment
Я понял вторую часть, и почему она была там. Раньше я использовал connect by, но никогда не сталкивался с connect_by_root(), спасибо. - person JonathanPeel; 06.02.2014